178 lines
7.1 KiB
C#
178 lines
7.1 KiB
C#
using System;
|
|
using System.Data;
|
|
using MySql.Data.MySqlClient;
|
|
|
|
namespace Neshina1703
|
|
{
|
|
public static class MessageHelper
|
|
{
|
|
public static int CreateConversation(int employeeId1, int employeeId2)
|
|
{
|
|
try
|
|
{
|
|
using (var conn = DB.GetConnection())
|
|
{
|
|
conn.Open();
|
|
using (var transaction = conn.BeginTransaction())
|
|
{
|
|
var cmd1 = new MySqlCommand("INSERT INTO conversations (created_at) VALUES (NOW())", conn, transaction);
|
|
cmd1.ExecuteNonQuery();
|
|
cmd1.CommandText = "SELECT LAST_INSERT_ID()";
|
|
int conversationId = Convert.ToInt32(cmd1.ExecuteScalar());
|
|
|
|
var cmd2 = new MySqlCommand(
|
|
"INSERT INTO conversation_participants (conversation_id, employee_id) VALUES (@conv, @emp1), (@conv, @emp2)",
|
|
conn, transaction);
|
|
cmd2.Parameters.AddWithValue("@conv", conversationId);
|
|
cmd2.Parameters.AddWithValue("@emp1", employeeId1);
|
|
cmd2.Parameters.AddWithValue("@emp2", employeeId2);
|
|
cmd2.ExecuteNonQuery();
|
|
|
|
transaction.Commit();
|
|
return conversationId;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new Exception("Ошибка создания чата: " + ex.Message);
|
|
}
|
|
}
|
|
|
|
public static int? GetExistingConversation(int employeeId1, int employeeId2)
|
|
{
|
|
var query = @"SELECT c.id FROM conversations c
|
|
JOIN conversation_participants cp1 ON c.id = cp1.conversation_id
|
|
JOIN conversation_participants cp2 ON c.id = cp2.conversation_id
|
|
WHERE cp1.employee_id = @emp1 AND cp2.employee_id = @emp2";
|
|
|
|
var parameters = new MySqlParameter[]
|
|
{
|
|
new MySqlParameter("@emp1", employeeId1),
|
|
new MySqlParameter("@emp2", employeeId2)
|
|
};
|
|
|
|
var result = DB.ExecuteScalar(query, parameters);
|
|
return result != null && result != DBNull.Value ? Convert.ToInt32(result) : (int?)null;
|
|
}
|
|
|
|
public static void SendMessage(int conversationId, int senderId, string messageText)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(messageText)) return;
|
|
|
|
var query = @"INSERT INTO messages (conversation_id, sender_id, message_text, sent_at)
|
|
VALUES (@conv, @sender, @text, NOW())";
|
|
|
|
var parameters = new MySqlParameter[]
|
|
{
|
|
new MySqlParameter("@conv", conversationId),
|
|
new MySqlParameter("@sender", senderId),
|
|
new MySqlParameter("@text", messageText)
|
|
};
|
|
|
|
DB.ExecuteCommand(query, parameters);
|
|
|
|
DB.ExecuteCommand("UPDATE conversations SET updated_at = NOW() WHERE id = @id",
|
|
new MySqlParameter[] { new MySqlParameter("@id", conversationId) });
|
|
}
|
|
|
|
public static DataTable GetMessages(int conversationId, int limit = 100)
|
|
{
|
|
var query = @"SELECT m.id, m.message_text, m.sent_at, m.is_read,
|
|
e.id as sender_id, e.full_name as sender_name
|
|
FROM messages m
|
|
JOIN employees e ON m.sender_id = e.id
|
|
WHERE m.conversation_id = @conv
|
|
ORDER BY m.sent_at DESC
|
|
LIMIT @limit";
|
|
|
|
var parameters = new MySqlParameter[]
|
|
{
|
|
new MySqlParameter("@conv", conversationId),
|
|
new MySqlParameter("@limit", limit)
|
|
};
|
|
|
|
var table = DB.ExecuteQuery(query, parameters);
|
|
var view = table.DefaultView;
|
|
view.Sort = "sent_at ASC";
|
|
return view.ToTable();
|
|
}
|
|
|
|
public static DataTable GetConversationsForEmployee(int employeeId)
|
|
{
|
|
var query = @"SELECT c.id, c.updated_at,
|
|
e.id as other_employee_id,
|
|
e.full_name as other_employee_name,
|
|
(SELECT COUNT(*) FROM messages m
|
|
WHERE m.conversation_id = c.id
|
|
AND m.sender_id != @emp
|
|
AND m.is_read = FALSE) as unread_count,
|
|
(SELECT message_text FROM messages m2
|
|
WHERE m2.conversation_id = c.id
|
|
ORDER BY m2.sent_at DESC LIMIT 1) as last_message
|
|
FROM conversations c
|
|
JOIN conversation_participants cp ON c.id = cp.conversation_id
|
|
JOIN employees e ON e.id = (
|
|
SELECT cp2.employee_id FROM conversation_participants cp2
|
|
WHERE cp2.conversation_id = c.id AND cp2.employee_id != @emp
|
|
LIMIT 1
|
|
)
|
|
WHERE cp.employee_id = @emp
|
|
ORDER BY c.updated_at DESC";
|
|
|
|
var parameters = new MySqlParameter[]
|
|
{
|
|
new MySqlParameter("@emp", employeeId)
|
|
};
|
|
|
|
return DB.ExecuteQuery(query, parameters);
|
|
}
|
|
|
|
public static DataTable GetAllEmployeesExcept(int currentEmployeeId)
|
|
{
|
|
var query = @"SELECT id, full_name, position_id
|
|
FROM employees
|
|
WHERE id != @emp
|
|
ORDER BY full_name";
|
|
|
|
var parameters = new MySqlParameter[]
|
|
{
|
|
new MySqlParameter("@emp", currentEmployeeId)
|
|
};
|
|
|
|
return DB.ExecuteQuery(query, parameters);
|
|
}
|
|
|
|
public static void MarkMessagesAsRead(int conversationId, int employeeId)
|
|
{
|
|
var query = @"UPDATE messages m
|
|
JOIN conversation_participants cp ON m.conversation_id = cp.conversation_id
|
|
SET m.is_read = TRUE
|
|
WHERE m.conversation_id = @conv
|
|
AND m.sender_id != @emp";
|
|
|
|
var parameters = new MySqlParameter[]
|
|
{
|
|
new MySqlParameter("@conv", conversationId),
|
|
new MySqlParameter("@emp", employeeId)
|
|
};
|
|
|
|
DB.ExecuteCommand(query, parameters);
|
|
}
|
|
|
|
public static int GetUnreadMessagesCount(int employeeId)
|
|
{
|
|
var query = @"SELECT COUNT(*) FROM messages m
|
|
JOIN conversation_participants cp ON m.conversation_id = cp.conversation_id
|
|
WHERE cp.employee_id = @emp AND m.sender_id != @emp AND m.is_read = FALSE";
|
|
|
|
var parameters = new MySqlParameter[]
|
|
{
|
|
new MySqlParameter("@emp", employeeId)
|
|
};
|
|
|
|
var result = DB.ExecuteScalar(query, parameters);
|
|
return result != null && result != DBNull.Value ? Convert.ToInt32(result) : 0;
|
|
}
|
|
}
|
|
} |