From 7f9ca4200e2b3ff5d9bec0b1e039b379af6ea10d Mon Sep 17 00:00:00 2001 From: Maxim Slipenko Date: Sun, 22 May 2022 01:19:10 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20Logs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AwesomeEmailExtractor.csproj | 1 + Globals.cs | 58 ++++++++++++++++++- Logs.cs | 109 +++++++++++++++++++++++++++++++++++ MainForm.cs | 23 ++++++-- Program.cs | 13 +++-- 5 files changed, 192 insertions(+), 12 deletions(-) create mode 100644 Logs.cs diff --git a/AwesomeEmailExtractor.csproj b/AwesomeEmailExtractor.csproj index 681d84e..e40ec8d 100644 --- a/AwesomeEmailExtractor.csproj +++ b/AwesomeEmailExtractor.csproj @@ -79,6 +79,7 @@ + Form diff --git a/Globals.cs b/Globals.cs index df03053..4739d57 100644 --- a/Globals.cs +++ b/Globals.cs @@ -13,6 +13,7 @@ namespace AwesomeEmailExtractor { // Getter and setter for SQLite database connection public static SqliteConnection db { get; set; } + public static SqliteConnection logsDb { get; set; } public static string getAppDirectory() { @@ -32,7 +33,44 @@ namespace AwesomeEmailExtractor ); } - + public static string getDefaultPathAppLogs() + { + return Path.Combine( + getAppDirectory(), + "logs.db" + ); + } + + public static string getPathAppLogs() + { + SqliteCommand command = new SqliteCommand(); + command.Connection = db; + command.CommandText = "SELECT logs_db_path FROM app_settings LIMIT 1"; + + SqliteDataReader reader = command.ExecuteReader(); + while (reader.Read()) + { + return reader["logs_db_path"].ToString(); + } + + return getDefaultPathAppLogs(); + } + + public static void CreateLogsTable() + { + SqliteCommand command = new SqliteCommand(); + command.Connection = logsDb; + + command.CommandText = "CREATE TABLE IF NOT EXISTS logs_actions (id INTEGER PRIMARY KEY, name TEXT NOT NULL)"; + command.ExecuteNonQuery(); + + command.CommandText = "INSERT OR IGNORE INTO logs_actions (id, name) VALUES (0, 'Выполнение');"; + command.ExecuteNonQuery(); + + command.CommandText = "CREATE TABLE IF NOT EXISTS logs (id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, date TEXT NOT NULL, action INTEGER NOT NULL, message TEXT NOT NULL, FOREIGN KEY(action) REFERENCES logs_actions(id));"; + command.ExecuteNonQuery(); + + } public static void CreateTables() { @@ -44,7 +82,11 @@ namespace AwesomeEmailExtractor command.ExecuteNonQuery(); // Добавить роли - command.CommandText = "INSERT OR IGNORE INTO roles (id, name) VALUES (0, 'DEFAULT'), (1, 'ADMIN');"; + command.CommandText = "INSERT OR IGNORE INTO roles (id, name) VALUES (0, 'Обычный'), (1, 'Администратор');"; + command.ExecuteNonQuery(); + + // Создать таблицу для хранения настроек (знаю, так плохо, но сойдет) + command.CommandText = "CREATE TABLE IF NOT EXISTS app_settings (logs_db_path TEXT);"; command.ExecuteNonQuery(); // Создать таблицу для хранения пользователей @@ -63,6 +105,18 @@ namespace AwesomeEmailExtractor command.ExecuteNonQuery(); command.Parameters.Clear(); } + + command.CommandText = "SELECT COUNT(*) FROM app_settings"; + + if (Convert.ToInt32(command.ExecuteScalar()) == 0) + { + command.CommandText = "INSERT INTO app_settings (logs_db_path) VALUES (@logs_db_path);"; + + SqliteParameter logsDbPathParam = new SqliteParameter("@logs_db_path", getDefaultPathAppLogs()); + command.Parameters.Add(logsDbPathParam); + command.ExecuteNonQuery(); + command.Parameters.Clear(); + } } } } diff --git a/Logs.cs b/Logs.cs new file mode 100644 index 0000000..fa1a1bf --- /dev/null +++ b/Logs.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Data.Sqlite; + +namespace AwesomeEmailExtractor +{ + public class Logs + { + public class LogData { + public User user; + public string date; + public Action action; + public string message; + } + + public enum Action + { + Execute, + } + + public static void Log(User user, Action action, Dictionary options) + { + SqliteCommand command = new SqliteCommand(); + command.Connection = Globals.logsDb; + + command.CommandText = "INSERT INTO logs (user_id, date, action, message) VALUES (@user_id, strftime('%Y-%m-%d %H:%M:%S', datetime('now')), @action, @message)"; + + command.Parameters.AddWithValue("@user_id", user.ID); + command.Parameters.AddWithValue("@action", action); + command.Parameters.AddWithValue("@message", GetLogMessage(action, options)); + + command.ExecuteNonQuery(); + } + + public static List GetLogs(User user) + { + SqliteCommand command = new SqliteCommand(); + command.Connection = Globals.logsDb; + + command.CommandText = "SELECT date, action, message FROM logs WHERE user_id = @user_id ORDER BY date DESC"; + command.Parameters.AddWithValue("@user_id", user.ID); + + SqliteDataReader reader = command.ExecuteReader(); + + List logs = new List(); + while (reader.Read()) + { + logs.Add(new LogData() + { + user = user, + date = reader.GetString(0), + action = (Action)reader.GetInt32(1), + message = reader.GetString(2) + }); + } + + return logs; + } + + public static List GetLogs() + { + SqliteCommand command = new SqliteCommand(); + command.Connection = Globals.logsDb; + command.CommandText = "ATTACH DATABASE @dbpath AS appDB"; + command.Parameters.AddWithValue("@dbpath", Globals.getAppDatabase()); + command.ExecuteNonQuery(); + + command.CommandText = "SELECT user_id, appDB.users.login, appDB.users.id as role_id, date, action, message FROM logs LEFT JOIN appDB.users ON logs.user_id = appDB.users.id ORDER BY date DESC "; + + SqliteDataReader reader = command.ExecuteReader(); + + List logs = new List(); + while (reader.Read()) + { + logs.Add(new LogData() + { + user = new User(reader.GetInt32(0), reader.GetString(1), (UserRoles)reader.GetInt32(2)), + date = reader.GetString(3), + action = (Action)reader.GetInt32(4), + message = reader.GetString(5) + }); + } + + return logs; + } + + public static string GetLogMessage(Action action, Dictionary options) + { + if (action == Action.Execute) + { + string sourceText = (string)options["sourceText"]; + int count = (int)options["count"]; + List uniqueEmails = options["uniqueEmails"] as List; + + + return $"Пользователь выполнил поиск email-ов c таким исходным текстом: [ {sourceText}. ]\n" + + $"Найдено {count} email-ов.\n" + + $"Список уникальных: {String.Join(", ", uniqueEmails)}."; + } + else + { + return ""; + } + } + } +} diff --git a/MainForm.cs b/MainForm.cs index c66334d..5317cb7 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -16,9 +16,18 @@ namespace AwesomeEmailExtractor { InitializeComponent(); } - + private void executeButton_Click(object sender, EventArgs e) { + // Получаем исходный текст из sourceRichTextBox + string sourceText = sourceRichTextBox.Text; + + if (sourceText.Length == 0) + { + MessageBox.Show("Введите текст в поле исходного текста", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + // Чистим предыдущий результат toolStripStatusLabel.Text = ""; resultCountLabel.Text = ""; @@ -27,9 +36,6 @@ namespace AwesomeEmailExtractor // Объявляем список уникальных e-mail-ов List uniqueEmails = new List(); - // Получаем исходный текст из sourceRichTextBox - string sourceText = sourceRichTextBox.Text; - // Вызываем метод для извлечения e-mail-ов int count = ExtactEmailsAlgorithm.Extract(sourceText, out uniqueEmails); @@ -37,6 +43,15 @@ namespace AwesomeEmailExtractor toolStripStatusLabel.Text = "Успех!"; resultCountLabel.Text = $"Количество e-mail-ов в тексте: {count}"; uniqueListBox.DataSource = uniqueEmails; + + Logs.Log( + new User(1, "", UserRoles.ADMIN), + Logs.Action.Execute, + new Dictionary() { + { "sourceText", sourceText }, + { "count", count }, + { "uniqueEmails", uniqueEmails } + }); } } } diff --git a/Program.cs b/Program.cs index eebf76d..5067411 100644 --- a/Program.cs +++ b/Program.cs @@ -18,11 +18,7 @@ namespace AwesomeEmailExtractor { preMain(); - User user = new User(1, "admin", UserRoles.ADMIN); - AdminUtils admin = new AdminUtils(user); - - - + Logs.GetLogs(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); @@ -37,11 +33,16 @@ namespace AwesomeEmailExtractor { Directory.CreateDirectory(Globals.getAppDirectory()); } - + Globals.db = new SqliteConnection("Data Source=" + Globals.getAppDatabase()); Globals.db.Open(); Globals.CreateTables(); + + Globals.logsDb = new SqliteConnection("Data Source=" + Globals.getPathAppLogs()); + Globals.logsDb.Open(); + + Globals.CreateLogsTable(); } static void postMain()