diff --git a/src/JiraTimeBot.Core/Configuration/ISettingsManager.cs b/src/JiraTimeBot.Core/Configuration/ISettingsManager.cs new file mode 100644 index 0000000..f896421 --- /dev/null +++ b/src/JiraTimeBot.Core/Configuration/ISettingsManager.cs @@ -0,0 +1,12 @@ +using System; + +namespace JiraTimeBot.Core.Configuration +{ + public interface ISettingsManager + { + Settings Load(); + Settings LoadAndCheck(Action settingsSource, Action errorMessageReporter); + + void Save(Settings settings); + } +} \ No newline at end of file diff --git a/src/JiraTimeBot.Core/Configuration/Settings.cs b/src/JiraTimeBot.Core/Configuration/Settings.cs index b240826..253e84c 100644 --- a/src/JiraTimeBot.Core/Configuration/Settings.cs +++ b/src/JiraTimeBot.Core/Configuration/Settings.cs @@ -1,148 +1,31 @@ using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Windows.Forms; -using JiraTimeBot.Core.Encryption; -using Newtonsoft.Json; namespace JiraTimeBot.Core.Configuration { public class Settings { - public int MinuterPerWorkDay = 8 * 60; - public int RountToMinutes { get; set; } - public string JiraUrl = "https://myteam.aeroclub.ru"; - public string RepositoryPath { get; set; } - public string MercurialAuthorEmail { get; set; } - public string JiraUserName { get; set; } - public string JiraPassword { get; set; } + public int MinuterPerWorkDay = 8 * 60; + public TimeSpan ActivationTime { get; set; } + public bool AddCommentsToWorklog { get; set; } - public WorkType WorkType { get; set; } + + public string JiraPassword { get; set; } + public string JiraQuery { get; set; } + + public string JiraUserName { get; set; } + + public string MercurialAuthorEmail { get; set; } + + public string RepositoryPath { get; set; } + + public int RoundToMinutes { get; set; } + public string TimeControlTask { get; set; } - - public static Settings LoadAndCheck(Action settingsSource, Action errorMessageReporter) - { - Settings settings; - bool settingsValid; - - do - { - settings = Load(); - settingsValid = SettingsIsValid(settings, out var message); - - if (!settingsValid) - { - if (!string.IsNullOrEmpty(message)) - { - errorMessageReporter(message); - } - - settingsSource(); - } - - } while (!settingsValid); - - return settings; - } - - private static bool SettingsIsValid(Settings settings, out string message) - { - if (settings == null) - { - message = "Заполните настройки"; - return false; - } - - var errors = new List(); - message = null; - - if (settings.RountToMinutes == default(int)) - { - errors.Add("Укажите округление времени, например, 10 (минут)"); - } - - if (string.IsNullOrEmpty(settings.JiraPassword)) - { - errors.Add("Укажите Password от Jira"); - } - - if (string.IsNullOrEmpty(settings.JiraUserName)) - { - errors.Add("Укажите UserName от Jira"); - } - - if (settings.WorkType == WorkType.Mercurial && (string.IsNullOrEmpty(settings.RepositoryPath) || !Directory.Exists(settings.RepositoryPath))) - { - errors.Add("Укажите верный RepositoryPath"); - } - - if (!string.IsNullOrEmpty(settings.TimeControlTask) && !settings.TimeControlTask.Contains("-")) - { - errors.Add("Укажите верно зажачу контроля времени. Она джолжна содержать знак '-', например, SV-1211"); - } - - var hasErrors = errors.Any(); - if (hasErrors) - { - message = string.Join(Environment.NewLine, errors); - } - - return !hasErrors; - } - - public static Settings Load() - { - var configDir = Application.UserAppDataPath.Replace(Application.ProductVersion, ""); - var settingsPath = Path.Combine(configDir, _settingsFileName); - if (!File.Exists(settingsPath)) - { - return null; - } - - var settingsText = File.ReadAllText(settingsPath); - - Settings settings; - - try - { - settings = JsonConvert.DeserializeObject(settingsText); - if (settings == null) - { - return null; - } - var password = new PasswordEncryptionClass().Decrypt(settings.JiraUserName, settings.JiraPassword, settings.JiraUrl); - settings.JiraPassword = password; - } - catch (JsonReaderException) - { - return null; - } - - return settings; - } - - public void Save() - { - var password = new PasswordEncryptionClass().Encrypt(this.JiraUserName, this.JiraPassword, this.JiraUrl); - this.JiraPassword = password; - - var configDir = Application.UserAppDataPath.Replace(Application.ProductVersion, ""); - var settingsPath = Path.Combine(configDir, _settingsFileName); - var settingsString = JsonConvert.SerializeObject(this); - File.WriteAllText(settingsPath, settingsString); - } - - private static string _settingsFileName = "settings.json"; - } - - public enum WorkType - { - Mercurial = 0, - JiraLogs = 1, + + public WorkType WorkType { get; set; } } } diff --git a/src/JiraTimeBot.Core/Configuration/SettingsManager.cs b/src/JiraTimeBot.Core/Configuration/SettingsManager.cs new file mode 100644 index 0000000..2bb3b6b --- /dev/null +++ b/src/JiraTimeBot.Core/Configuration/SettingsManager.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Windows.Forms; +using JiraTimeBot.Core.Encryption; +using Newtonsoft.Json; + +namespace JiraTimeBot.Core.Configuration +{ + public class SettingsManager : ISettingsManager + { + private static string _settingsFileName = "settings.json"; + + public Settings Load() + { + var configDir = Application.UserAppDataPath.Replace(Application.ProductVersion, ""); + var settingsPath = Path.Combine(configDir, _settingsFileName); + if (!File.Exists(settingsPath)) + { + return null; + } + + var settingsText = File.ReadAllText(settingsPath); + + Settings settings; + + try + { + settings = JsonConvert.DeserializeObject(settingsText); + if (settings == null) + { + return null; + } + var password = new PasswordEncryptionClass().Decrypt(settings.JiraUserName, settings.JiraPassword, settings.JiraUrl); + settings.JiraPassword = password; + } + catch (JsonReaderException) + { + return null; + } + + return settings; + } + + + public Settings LoadAndCheck(Action settingsSource, Action errorMessageReporter) + { + Settings settings; + bool settingsValid; + + do + { + settings = Load(); + settingsValid = SettingsIsValid(settings, out var message); + + if (!settingsValid) + { + if (!string.IsNullOrEmpty(message)) + { + errorMessageReporter(message); + } + + settingsSource(); + } + + } while (!settingsValid); + + return settings; + } + + public void Save(Settings settings) + { + var password = new PasswordEncryptionClass().Encrypt(settings.JiraUserName, settings.JiraPassword, settings.JiraUrl); + settings.JiraPassword = password; + + var configDir = Application.UserAppDataPath.Replace(Application.ProductVersion, ""); + var settingsPath = Path.Combine(configDir, _settingsFileName); + var settingsString = JsonConvert.SerializeObject(settings); + File.WriteAllText(settingsPath, settingsString); + } + private static bool SettingsIsValid(Settings settings, out string message) + { + if (settings == null) + { + message = "Заполните настройки"; + return false; + } + + var errors = new List(); + message = null; + + if (settings.RoundToMinutes == default(int)) + { + errors.Add("Укажите округление времени, например, 10 (минут)"); + } + + if (string.IsNullOrEmpty(settings.JiraPassword)) + { + errors.Add("Укажите Password от Jira"); + } + + if (string.IsNullOrEmpty(settings.JiraUserName)) + { + errors.Add("Укажите UserName от Jira"); + } + + if (settings.WorkType == WorkType.Mercurial && (string.IsNullOrEmpty(settings.RepositoryPath) || !Directory.Exists(settings.RepositoryPath))) + { + errors.Add("Укажите верный RepositoryPath"); + } + + if (!string.IsNullOrEmpty(settings.TimeControlTask) && !settings.TimeControlTask.Contains("-")) + { + errors.Add("Укажите верно зажачу контроля времени. Она джолжна содержать знак '-', например, SV-1211"); + } + + var hasErrors = errors.Any(); + if (hasErrors) + { + message = string.Join(Environment.NewLine, errors); + } + + return !hasErrors; + } + + } +} \ No newline at end of file diff --git a/src/JiraTimeBot.Core/Configuration/WorkType.cs b/src/JiraTimeBot.Core/Configuration/WorkType.cs new file mode 100644 index 0000000..34a938a --- /dev/null +++ b/src/JiraTimeBot.Core/Configuration/WorkType.cs @@ -0,0 +1,8 @@ +namespace JiraTimeBot.Core.Configuration +{ + public enum WorkType + { + Mercurial = 0, + JiraLogs = 1, + } +} \ No newline at end of file diff --git a/src/JiraTimeBot.Core/TaskTime/Objects/TaskTimeItem.cs b/src/JiraTimeBot.Core/TaskTime/Objects/TaskTimeItem.cs index 258fc65..9a602f8 100644 --- a/src/JiraTimeBot.Core/TaskTime/Objects/TaskTimeItem.cs +++ b/src/JiraTimeBot.Core/TaskTime/Objects/TaskTimeItem.cs @@ -8,7 +8,6 @@ namespace JiraTimeBot.Core.TaskTime.Objects public string Branch { get; set; } public TimeSpan Time { get; set; } public int Commits { get; set; } - public DateTime StartTime { get; set; } public DateTime EndTime { get; set; } } diff --git a/src/JiraTimeBot.Core/TaskTime/TaskTimeByCommitsCalculator.cs b/src/JiraTimeBot.Core/TaskTime/TaskTimeByCommitsCalculator.cs index faa4df2..53e11bb 100644 --- a/src/JiraTimeBot.Core/TaskTime/TaskTimeByCommitsCalculator.cs +++ b/src/JiraTimeBot.Core/TaskTime/TaskTimeByCommitsCalculator.cs @@ -32,11 +32,11 @@ namespace JiraTimeBot.Core.TaskTime } //если кол-во коммитов более чем кол-во интервалов - то уменьшим интервал вдвое. - while (totalCommitsCount > (8 * (60.0 / settings.RountToMinutes))) + while (totalCommitsCount > (8 * (60.0 / settings.RoundToMinutes))) { - settings.RountToMinutes = (int)RoundTo((decimal)(settings.RountToMinutes / 2.0), 5); - _log.Info($"Слишком много задач - уменьшаю интервал до {settings.RountToMinutes}."); - if (settings.RountToMinutes == 5) + settings.RoundToMinutes = (int)RoundTo((decimal)(settings.RoundToMinutes / 2.0), 5); + _log.Info($"Слишком много задач - уменьшаю интервал до {settings.RoundToMinutes}."); + if (settings.RoundToMinutes == 5) { break; } @@ -66,7 +66,7 @@ namespace JiraTimeBot.Core.TaskTime } int currentTaskCommits = taskGroup.Count(); - int currentTaskTime = (int)RoundTo(minutesPerWorkDay / totalCommitsCount * currentTaskCommits, settings.RountToMinutes); + int currentTaskTime = (int)RoundTo(minutesPerWorkDay / totalCommitsCount * currentTaskCommits, settings.RoundToMinutes); remainMinutes = remainMinutes - currentTaskTime; var orderedTasks = taskGroup.OrderBy(f => f.Time).ToArray(); @@ -126,9 +126,14 @@ namespace JiraTimeBot.Core.TaskTime private decimal RoundTo(decimal value, decimal to = 15, bool up = true) { if ((value % to) == 0) + { return value; + } + if (up) + { return (value - (value % to) + to); + } return (value - (value % to)); } diff --git a/src/JiraTimeBot.sln.DotSettings b/src/JiraTimeBot.sln.DotSettings index be47069..a620348 100644 --- a/src/JiraTimeBot.sln.DotSettings +++ b/src/JiraTimeBot.sln.DotSettings @@ -1,3 +1,4 @@  True - True \ No newline at end of file + True + True \ No newline at end of file diff --git a/src/JiraTimeBot/DI/ContainerBuilder.cs b/src/JiraTimeBot/DI/ContainerBuilder.cs index 0012f75..06fe295 100644 --- a/src/JiraTimeBot/DI/ContainerBuilder.cs +++ b/src/JiraTimeBot/DI/ContainerBuilder.cs @@ -4,6 +4,7 @@ using JiraTimeBot.UI.Tray; using System; using System.Windows.Forms; using JiraTimeBot.Core; +using JiraTimeBot.Core.Configuration; using JiraTimeBot.Core.JiraIntegration; using JiraTimeBot.Core.JiraIntegration.Comments; using JiraTimeBot.Core.Mercurial; @@ -62,6 +63,7 @@ namespace JiraTimeBot.DI _builder.RegisterType().AsSelf().AsImplementedInterfaces(); _builder.RegisterType().AsSelf().AsImplementedInterfaces(); + _builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); var container = _builder.Build(); return container; diff --git a/src/JiraTimeBot/UI/frmMain.cs b/src/JiraTimeBot/UI/frmMain.cs index 248b28b..f95bef0 100644 --- a/src/JiraTimeBot/UI/frmMain.cs +++ b/src/JiraTimeBot/UI/frmMain.cs @@ -72,7 +72,7 @@ namespace JiraTimeBot.UI _settingsWindowShow = () => { - var frmSettings = new frmSettings(_container.Resolve()); + var frmSettings = new frmSettings(_container.Resolve(), _container.Resolve()); frmSettings.ShowDialog(this); }; _settingsErrorReporter = msg => MessageBox.Show(msg, "Загрузка настроек", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);; @@ -85,7 +85,9 @@ namespace JiraTimeBot.UI public Settings ReadSettingsAndLock() { - _settings = Settings.LoadAndCheck(_settingsWindowShow, _settingsErrorReporter); + var settingsManager = _container.Resolve(); + + _settings = settingsManager.LoadAndCheck(_settingsWindowShow, _settingsErrorReporter); LockUnlock(false); @@ -123,7 +125,8 @@ namespace JiraTimeBot.UI private void PrintStartMessage() { - _settings = Settings.LoadAndCheck(_settingsWindowShow, _settingsErrorReporter); + var settingsManager = _container.Resolve(); + _settings = settingsManager.LoadAndCheck(_settingsWindowShow, _settingsErrorReporter); _log.Info($"Загружен бот для {_settings.JiraUserName}, Режим: {_settings.WorkType.ToString()}, работаем в {_settings.RepositoryPath}"); } diff --git a/src/JiraTimeBot/UI/frmSettings.cs b/src/JiraTimeBot/UI/frmSettings.cs index 0e99247..2f6afd3 100644 --- a/src/JiraTimeBot/UI/frmSettings.cs +++ b/src/JiraTimeBot/UI/frmSettings.cs @@ -8,16 +8,18 @@ namespace JiraTimeBot.UI public partial class frmSettings : Form { private readonly AutoStartUp _autoStart; + private readonly ISettingsManager _settingsManager; - public frmSettings(AutoStartUp autoStart) + public frmSettings(AutoStartUp autoStart, ISettingsManager settingsManager) { _autoStart = autoStart; + _settingsManager = settingsManager; InitializeComponent(); } private void frmSettings_Load(object sender, EventArgs e) { - var settings = Settings.Load(); + var settings = _settingsManager.Load(); if (settings != null) { SetSettings(settings); @@ -34,7 +36,7 @@ namespace JiraTimeBot.UI txtRepoPath.Text = settings.RepositoryPath; actTime.Text = settings.ActivationTime.ToString("hh\\:mm\\:ss"); chkAddComments.Checked = settings.AddCommentsToWorklog; - txtRoundTo.Text = settings.RountToMinutes.ToString(); + txtRoundTo.Text = settings.RoundToMinutes.ToString(); cboWorkType.SelectedIndex = (int) settings.WorkType; txtTimeControlTask.Text = settings.TimeControlTask; txtJQL.Text = settings.JiraQuery; @@ -57,7 +59,7 @@ namespace JiraTimeBot.UI ActivationTime = TimeSpan.Parse(actTime.Text), RepositoryPath = txtRepoPath.Text, AddCommentsToWorklog = chkAddComments.Checked, - RountToMinutes = roundTo, + RoundToMinutes = roundTo, WorkType = (WorkType) cboWorkType.SelectedIndex, JiraQuery = txtJQL.Text, TimeControlTask = txtTimeControlTask.Text, @@ -71,7 +73,7 @@ namespace JiraTimeBot.UI private void btnSave_Click(object sender, EventArgs e) { var settings = ReadSettingsAndLock(); - settings.Save(); + _settingsManager.Save(settings); _autoStart.Set(chkAutostart.Checked); MessageBox.Show("Настройки сохранены.");