diff --git a/src/Adapters/WorkItemAdapter.cs b/src/Adapters/WorkItemAdapter.cs index a7598ac..b56aa17 100644 --- a/src/Adapters/WorkItemAdapter.cs +++ b/src/Adapters/WorkItemAdapter.cs @@ -51,7 +51,7 @@ public List ToWorkItemsDto(List workItems) .ToList(); } - public WorkItemChangeDto ToWorkItemChangeDto(WorkItemChange workIteChange) + public static WorkItemChangeDto ToWorkItemChangeDto(WorkItemChange workIteChange) { if (workIteChange is null) return null; @@ -65,7 +65,7 @@ public WorkItemChangeDto ToWorkItemChangeDto(WorkItemChange workIteChange) }; } - public List ToWorkItemsChangeDto(List workItemsChanges) + public static List ToWorkItemsChangeDto(List workItemsChanges) { var workItemsChangeDto = new List(); @@ -80,7 +80,7 @@ public List ToWorkItemsChangeDto(List workIte .ToList(); } - public TimeByStateDto ToTimeByStateDto(TimeByState workItemStatusTime) + public static TimeByStateDto ToTimeByStateDto(TimeByState workItemStatusTime) { if (workItemStatusTime is null) return null; @@ -93,7 +93,7 @@ public TimeByStateDto ToTimeByStateDto(TimeByState workItemStatusTime) }; } - public List ToTimeByStatesDto(List workItemStatusTimes) + public static List ToTimeByStatesDto(List workItemStatusTimes) { var workItemStatusTimeDto = new List(); diff --git a/src/AzureDevopsTracker.csproj b/src/AzureDevopsTracker.csproj index aa7c3b4..65e6acc 100644 --- a/src/AzureDevopsTracker.csproj +++ b/src/AzureDevopsTracker.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 False AzureDevOpsTracker Elvis Souza | Diego Galante @@ -17,23 +17,26 @@ en LICENSE.md.txt A NuGet that allows you to use a Azure DevOps Service Hook to track workitems changes in a simply and detailed way. - 5.0.0.0 - 5.0.5 - 5.0.5 + 6.0.0.0 + 6.0.0 + 6.0.0 Add ChangeLog Feature + Azure DevOps Tracker - + - + + - + True + PreserveNewest diff --git a/src/Configurations/Configuration.cs b/src/Configurations/Configuration.cs index c9adcd0..703f6d8 100644 --- a/src/Configurations/Configuration.cs +++ b/src/Configurations/Configuration.cs @@ -15,7 +15,9 @@ namespace AzureDevopsTracker.Configurations { public static class Configuration { - public static IServiceCollection AddAzureDevopsTracker(this IServiceCollection services, DataBaseConfig configurations, MessageConfig messageConfig = null) + public static IServiceCollection AddAzureDevopsTracker(this IServiceCollection services, + DataBaseConfig configurations, + MessageConfig messageConfig = null) { services.AddDbContext(options => options.UseSqlServer(DataBaseConfig.ConnectionsString)); diff --git a/src/Data/ChangeLogItemRepository.cs b/src/Data/ChangeLogItemRepository.cs index b4b0939..02d3746 100644 --- a/src/Data/ChangeLogItemRepository.cs +++ b/src/Data/ChangeLogItemRepository.cs @@ -1,8 +1,10 @@ using AzureDevopsTracker.Data.Context; using AzureDevopsTracker.Entities; using AzureDevopsTracker.Interfaces.Internals; +using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace AzureDevopsTracker.Data { @@ -10,14 +12,14 @@ internal class ChangeLogItemRepository : Repository, IChangeLogIt { public ChangeLogItemRepository(AzureDevopsTrackerContext context) : base(context) { } - public int CountItemsForRelease() + public async Task CountItemsForRelease() { - return DbSet.Count(x => string.IsNullOrEmpty(x.ChangeLogId)); + return await DbSet.CountAsync(x => string.IsNullOrEmpty(x.ChangeLogId)); } - public IEnumerable ListWaitingForRelease() + public async Task> ListWaitingForRelease() { - return DbSet.Where(x => string.IsNullOrEmpty(x.ChangeLogId)); + return await DbSet.Where(x => string.IsNullOrEmpty(x.ChangeLogId)).ToListAsync(); } } } \ No newline at end of file diff --git a/src/Data/ChangeLogRepository.cs b/src/Data/ChangeLogRepository.cs index 503cbff..c12243a 100644 --- a/src/Data/ChangeLogRepository.cs +++ b/src/Data/ChangeLogRepository.cs @@ -1,8 +1,9 @@ using AzureDevopsTracker.Data.Context; using AzureDevopsTracker.Entities; using AzureDevopsTracker.Interfaces.Internals; +using Microsoft.EntityFrameworkCore; using System; -using System.Linq; +using System.Threading.Tasks; namespace AzureDevopsTracker.Data { @@ -10,9 +11,9 @@ internal class ChangeLogRepository : Repository, IChangeLogRepository { public ChangeLogRepository(AzureDevopsTrackerContext context) : base(context) { } - public int CountChangeLogsCreatedToday() + public async Task CountChangeLogsCreatedToday() { - return DbSet.Count(x => x.CreatedAt.Date == DateTime.Now.Date); + return await DbSet.CountAsync(x => x.CreatedAt.Date == DateTime.Now.Date); } } } \ No newline at end of file diff --git a/src/Entities/ChangeLogItem.cs b/src/Entities/ChangeLogItem.cs index b572ffd..29aca95 100644 --- a/src/Entities/ChangeLogItem.cs +++ b/src/Entities/ChangeLogItem.cs @@ -10,7 +10,7 @@ public class ChangeLogItem : Entity public string Description { get; private set; } public string WorkItemType { get; private set; } public string ChangeLogId { get; private set; } - public bool WasReleased => string.IsNullOrEmpty(ChangeLogId?.Trim()); + public bool WasReleased => string.IsNullOrWhiteSpace(ChangeLogId); public ChangeLog ChangeLog { get; private set; } private ChangeLogItem() { } diff --git a/src/Entities/WorkItem.cs b/src/Entities/WorkItem.cs index 03db258..d77090b 100644 --- a/src/Entities/WorkItem.cs +++ b/src/Entities/WorkItem.cs @@ -95,7 +95,7 @@ public void AddTimeByState(TimeByState timeByState) public void AddTimesByState(IEnumerable timesByState) { - if (timesByState is not null && !timesByState.Any()) + if (timesByState is null || timesByState?.Any() == false) return; foreach (var timeByState in timesByState) @@ -142,7 +142,9 @@ public IEnumerable CalculateTotalTimeByState() if (!_workItemsChanges.Any()) return timesByStateList; - foreach (var workItemChange in _workItemsChanges.OrderBy(x => x.CreatedAt).GroupBy(x => x.OldState).Where(x => x.Key is not null)) + foreach (var workItemChange in _workItemsChanges.OrderBy(x => x.CreatedAt) + .GroupBy(x => x.OldState) + .Where(x => x.Key is not null)) { var totalTime = TimeSpan.Zero; var totalWorkedTime = TimeSpan.Zero; diff --git a/src/Entities/WorkItemChange.cs b/src/Entities/WorkItemChange.cs index a1f39fa..5b601ac 100644 --- a/src/Entities/WorkItemChange.cs +++ b/src/Entities/WorkItemChange.cs @@ -139,7 +139,7 @@ public double CalculateTotalWorkedTime() } #region Private Methods - private TimeSpan SubtractDates(DateTime biger, DateTime minor) + private static TimeSpan SubtractDates(DateTime biger, DateTime minor) { if (biger.Hour == minor.Hour) { diff --git a/src/Extensions/HelperExtenions.cs b/src/Extensions/HelperExtenions.cs index f4a5859..78dc8da 100644 --- a/src/Extensions/HelperExtenions.cs +++ b/src/Extensions/HelperExtenions.cs @@ -25,7 +25,7 @@ public static string ExtractEmail(this string user) if (!user.Contains(" <") && !user.TrimEnd().Contains(">")) return user; - return user.Split("<").LastOrDefault().Split(">").FirstOrDefault(); + return user.Split("<").LastOrDefault()?.Split(">")?.FirstOrDefault(); } public static string ToTextTime(this TimeSpan timeSpan) diff --git a/src/Integrations/DiscordIntegration.cs b/src/Integrations/DiscordIntegration.cs index 16fe655..f662121 100644 --- a/src/Integrations/DiscordIntegration.cs +++ b/src/Integrations/DiscordIntegration.cs @@ -97,7 +97,7 @@ public class Field public bool IsInline { get; set; } } - private IEnumerable GetText(ChangeLog changeLog) + private static IEnumerable GetText(ChangeLog changeLog) { var changeLogItemsAgrupado = changeLog.ChangeLogItems.GroupBy(d => d.WorkItemType); diff --git a/src/Integrations/MessageIntegration.cs b/src/Integrations/MessageIntegration.cs index 9bb9fa0..7a3064b 100644 --- a/src/Integrations/MessageIntegration.cs +++ b/src/Integrations/MessageIntegration.cs @@ -13,48 +13,46 @@ public abstract class MessageIntegration private static readonly string MEGAFONE_GIF = "megafone.gif"; private static readonly string LOGO_TYPINGHARD_16X16 = "logo-typinghard-16x16.png"; - protected internal string GetTitle() + protected internal static string GetTitle() { return $"Nova atualização da plataforma"; } - protected internal string GetVersion(ChangeLog changeLog) + protected internal static string GetVersion(ChangeLog changeLog) { return $"Versão: {changeLog.Number}"; } - protected internal string GetAnnouncementImageUrl() + protected internal static string GetAnnouncementImageUrl() { return $"{CDN_URL}{MEGAFONE_GIF}"; } - protected internal string GetLogoTypingHard16x16Url() + protected internal static string GetLogoTypingHard16x16Url() { return $"{CDN_URL}{LOGO_TYPINGHARD_16X16}"; } - protected internal string GetFileVersion() + protected internal static string GetFileVersion() { System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); System.Diagnostics.FileVersionInfo fileVersionInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location); return fileVersionInfo.FileVersion; } - protected internal string GetNugetVersion() + protected internal static string GetNugetVersion() { return $"Powered by **Typing Hard** • nuget version {GetFileVersion()}"; } - protected internal HttpResponseMessage Notify(object body) + protected internal static HttpResponseMessage Notify(object body) { var json = Newtonsoft.Json.JsonConvert.SerializeObject(body); var content = new StringContent(json, Encoding.UTF8, MIMETYPE); - HttpClient client = new HttpClient(); - return client.PostAsync(new Uri(MessageConfig.URL), - content).Result; - + using HttpClient client = new(); + return client.PostAsync(new Uri(MessageConfig.URL), content).Result; } } } diff --git a/src/Integrations/MicrosoftTeamsIntegration.cs b/src/Integrations/MicrosoftTeamsIntegration.cs index 1933002..ec35971 100644 --- a/src/Integrations/MicrosoftTeamsIntegration.cs +++ b/src/Integrations/MicrosoftTeamsIntegration.cs @@ -62,7 +62,7 @@ internal override void Send(ChangeLog changeLog) Notify(values); } - private string GetText(ChangeLog changeLog) + private static string GetText(ChangeLog changeLog) { if (changeLog is null || !changeLog.ChangeLogItems.Any()) return string.Empty; @@ -74,7 +74,7 @@ private string GetText(ChangeLog changeLog) return text.ToString(); } - private string GetWorkItemsDescriptionSection(string sectionName, IEnumerable changeLogItems) + private static string GetWorkItemsDescriptionSection(string sectionName, IEnumerable changeLogItems) { StringBuilder text = new(); if (!changeLogItems.Any()) return string.Empty; @@ -87,18 +87,18 @@ private string GetWorkItemsDescriptionSection(string sectionName, IEnumerable**{workItem.WorkItemId}** - {description}
"; } - private string GetDescription(string description) + private static string GetDescription(string description) { return description.Replace("
", "").Replace("
", "").Replace("
", ""); } - private string GetFooter() + private static string GetFooter() { return $"
{GetNugetVersion()}"; } diff --git a/src/Interfaces/IChangeLogService.cs b/src/Interfaces/IChangeLogService.cs index 3c97c16..4d5e375 100644 --- a/src/Interfaces/IChangeLogService.cs +++ b/src/Interfaces/IChangeLogService.cs @@ -1,11 +1,12 @@ using AzureDevopsTracker.Entities; +using System.Threading.Tasks; namespace AzureDevopsTracker.Interfaces { public interface IChangeLogService { - int CountItemsForRelease(); - ChangeLog Release(); + Task CountItemsForRelease(); + Task Release(); string SendToMessengers(ChangeLog changeLog); } } \ No newline at end of file diff --git a/src/Interfaces/Internals/IChangeLogItemRepository.cs b/src/Interfaces/Internals/IChangeLogItemRepository.cs index 0fe8145..eca1cec 100644 --- a/src/Interfaces/Internals/IChangeLogItemRepository.cs +++ b/src/Interfaces/Internals/IChangeLogItemRepository.cs @@ -1,11 +1,12 @@ using AzureDevopsTracker.Entities; using System.Collections.Generic; +using System.Threading.Tasks; namespace AzureDevopsTracker.Interfaces.Internals { public interface IChangeLogItemRepository : IRepository { - int CountItemsForRelease(); - IEnumerable ListWaitingForRelease(); + Task CountItemsForRelease(); + Task> ListWaitingForRelease(); } } \ No newline at end of file diff --git a/src/Interfaces/Internals/IChangeLogRepository.cs b/src/Interfaces/Internals/IChangeLogRepository.cs index 07a8e15..05b0dae 100644 --- a/src/Interfaces/Internals/IChangeLogRepository.cs +++ b/src/Interfaces/Internals/IChangeLogRepository.cs @@ -1,9 +1,10 @@ using AzureDevopsTracker.Entities; +using System.Threading.Tasks; namespace AzureDevopsTracker.Interfaces.Internals { public interface IChangeLogRepository : IRepository { - int CountChangeLogsCreatedToday(); + Task CountChangeLogsCreatedToday(); } } \ No newline at end of file diff --git a/src/Services/AzureDevopsTrackerService.cs b/src/Services/AzureDevopsTrackerService.cs index 06ccd9f..e5218a1 100644 --- a/src/Services/AzureDevopsTrackerService.cs +++ b/src/Services/AzureDevopsTrackerService.cs @@ -57,7 +57,7 @@ public async Task Create(CreateWorkItemDto create, bool addWorkItemChange = true if (addWorkItemChange) AddWorkItemChange(workItem, create); - CheckWorkItemAvailableToChangeLog(workItem, create.Resource.Fields); + await CheckWorkItemAvailableToChangeLog(workItem, create.Resource.Fields); AddCustomFields(workItem); @@ -104,7 +104,7 @@ public async Task Update(UpdatedWorkItemDto update) AddWorkItemChange(workItem, update); - CheckWorkItemAvailableToChangeLog(workItem, update.Resource.Revision.Fields); + await CheckWorkItemAvailableToChangeLog(workItem, update.Resource.Revision.Fields); AddCustomFields(workItem); @@ -218,7 +218,7 @@ public string GetRequestBody() return corpo; } - public WorkItemChange ToWorkItemChange( + public static WorkItemChange ToWorkItemChange( string workItemId, string changedBy, string iterationPath, DateTime newDate, string newState, string oldState = null, DateTime? oldDate = null) @@ -226,7 +226,7 @@ public WorkItemChange ToWorkItemChange( return new WorkItemChange(workItemId, changedBy.ExtractEmail(), iterationPath, newDate, newState, oldState, oldDate); } - public void AddWorkItemChange(WorkItem workItem, CreateWorkItemDto create) + public static void AddWorkItemChange(WorkItem workItem, CreateWorkItemDto create) { var workItemChange = ToWorkItemChange(workItem.Id, create.Resource.Fields.ChangedBy, @@ -275,13 +275,13 @@ public void RemoveTimeByStateFromDataBase(WorkItem workItem) _workItemRepository.RemoveAllTimeByState(workItem.TimeByStates.ToList()); } - public void CheckWorkItemAvailableToChangeLog(WorkItem workItem, Fields fields) + public async Task CheckWorkItemAvailableToChangeLog(WorkItem workItem, Fields fields) { if (workItem.CurrentStatus != "Closed" && workItem.LastStatus == "Closed" && workItem.ChangeLogItem is not null && !workItem.ChangeLogItem.WasReleased) - RemoveChangeLogItem(workItem); + await RemoveChangeLogItem(workItem); if (workItem.CurrentStatus != "Closed" || fields.ChangeLogDescription.IsNullOrEmpty()) @@ -293,7 +293,7 @@ workItem.ChangeLogItem is not null && workItem.ChangeLogItem.Update(workItem.Title, workItem.Type, fields.ChangeLogDescription); } - public bool CheckWorkItemChangeExists(WorkItem workItem, WorkItemChange newWorkItemChange) + public static bool CheckWorkItemChangeExists(WorkItem workItem, WorkItemChange newWorkItemChange) { return workItem.WorkItemsChanges.Any(x => x.NewDate == newWorkItemChange.NewDate && x.OldDate == newWorkItemChange.OldDate && @@ -304,18 +304,18 @@ public bool CheckWorkItemChangeExists(WorkItem workItem, WorkItemChange newWorkI x.TotalWorkedTime == newWorkItemChange.TotalWorkedTime); } - public ChangeLogItem ToChangeLogItem(WorkItem workItem, Fields fields) + public static ChangeLogItem ToChangeLogItem(WorkItem workItem, Fields fields) { return new ChangeLogItem(workItem.Id, workItem.Title, fields.ChangeLogDescription, workItem.Type); } - public void RemoveChangeLogItem(WorkItem workItem) + public async Task RemoveChangeLogItem(WorkItem workItem) { var changeLogItem = _changeLogItemRepository.GetById(workItem.ChangeLogItem?.Id).Result; if (changeLogItem is not null) { _changeLogItemRepository.Delete(changeLogItem); - _changeLogItemRepository.SaveChangesAsync().Wait(); + await _changeLogItemRepository.SaveChangesAsync(); workItem.RemoveChangeLogItem(); } diff --git a/src/Services/ChangeLogService.cs b/src/Services/ChangeLogService.cs index baef4fa..fefb9ab 100644 --- a/src/Services/ChangeLogService.cs +++ b/src/Services/ChangeLogService.cs @@ -5,6 +5,7 @@ using AzureDevopsTracker.Statics; using Microsoft.Extensions.Configuration; using System.Linq; +using System.Threading.Tasks; namespace AzureDevopsTracker.Services { @@ -27,21 +28,21 @@ public ChangeLogService( _messageIntegration = messageIntegration; } - public int CountItemsForRelease() + public async Task CountItemsForRelease() { - return _changeLogItemRepository.CountItemsForRelease(); + return await _changeLogItemRepository.CountItemsForRelease(); } - public ChangeLog Release() + public async Task Release() { - var changeLogItems = _changeLogItemRepository.ListWaitingForRelease(); + var changeLogItems = await _changeLogItemRepository.ListWaitingForRelease(); if (!changeLogItems.Any()) return null; - var changeLog = CreateChangeLog(); + var changeLog = await CreateChangeLog(); changeLog.AddChangeLogItems(changeLogItems); - _changeLogRepository.Add(changeLog).Wait(); - _changeLogRepository.SaveChangesAsync().Wait(); + await _changeLogRepository.Add(changeLog); + await _changeLogRepository.SaveChangesAsync(); return changeLog; } @@ -53,11 +54,11 @@ public string SendToMessengers(ChangeLog changeLog) return $"The ChangeLog {changeLog.Number} was released."; } - private ChangeLog CreateChangeLog() + private async Task CreateChangeLog() { if (string.IsNullOrEmpty(_configuration[ConfigurationStatics.ADT_CHANGELOG_VERSION])) { - var changeLogsQuantity = _changeLogRepository.CountChangeLogsCreatedToday(); + var changeLogsQuantity = await _changeLogRepository.CountChangeLogsCreatedToday(); return new ChangeLog(changeLogsQuantity + 1); } return new ChangeLog(_configuration[ConfigurationStatics.ADT_CHANGELOG_VERSION]); diff --git a/tests/AzureDevopsTracker.Tests/AzureDevopsTracker.Tests.csproj b/tests/AzureDevopsTracker.Tests/AzureDevopsTracker.Tests.csproj index bb3bd0a..0837d26 100644 --- a/tests/AzureDevopsTracker.Tests/AzureDevopsTracker.Tests.csproj +++ b/tests/AzureDevopsTracker.Tests/AzureDevopsTracker.Tests.csproj @@ -9,7 +9,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/tests/AzureDevopsTracker.Tests/Usings.cs b/tests/AzureDevopsTracker.Tests/Usings.cs index 209548e..a5bd8fb 100644 --- a/tests/AzureDevopsTracker.Tests/Usings.cs +++ b/tests/AzureDevopsTracker.Tests/Usings.cs @@ -1,3 +1,3 @@ -global using Xunit; global using AzureDevopsTracker.Entities; -global using FluentAssertions; \ No newline at end of file +global using FluentAssertions; +global using Xunit; \ No newline at end of file