Skip to content

Commit 30876ee

Browse files
Merge branch 'version-5' of https://github.com/typinghard/azure-devops-tracker into feature/68
2 parents f2951b2 + af08b3d commit 30876ee

File tree

9 files changed

+66
-39
lines changed

9 files changed

+66
-39
lines changed

AzureDevopsTracker/AzureDevopsTracker.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
<NeutralLanguage>en</NeutralLanguage>
1818
<PackageLicenseFile>LICENSE.md.txt</PackageLicenseFile>
1919
<Description>A NuGet that allows you to use a Azure DevOps Service Hook to track workitems changes in a simply and detailed way.</Description>
20-
<AssemblyVersion>5.1.0.0</AssemblyVersion>
21-
<FileVersion>5.0.0-rc</FileVersion>
22-
<Version>5.0.0-rc</Version>
20+
<AssemblyVersion>5.0.0.0</AssemblyVersion>
21+
<FileVersion>5.0.3</FileVersion>
22+
<Version>5.0.3</Version>
2323
<PackageReleaseNotes>Add ChangeLog Feature</PackageReleaseNotes>
2424
</PropertyGroup>
2525

AzureDevopsTracker/Entities/ChangeLogItem.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public class ChangeLogItem : Entity
1010
public string Description { get; private set; }
1111
public string WorkItemType { get; private set; }
1212
public string ChangeLogId { get; private set; }
13+
public bool WasReleased => string.IsNullOrEmpty(ChangeLogId?.Trim());
1314

1415
/*EF*/
1516
public ChangeLog ChangeLog { get; private set; }

AzureDevopsTracker/Entities/WorkItem.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class WorkItem : Entity
3131
private readonly List<TimeByState> _timeByState;
3232
public IReadOnlyCollection<TimeByState> TimeByStates => _timeByState;
3333
public string CurrentStatus => _workItemsChanges?.OrderBy(x => x.CreatedAt)?.LastOrDefault()?.NewState;
34+
public string LastStatus => _workItemsChanges?.OrderBy(x => x.CreatedAt)?.ToList()?.Skip(1)?.LastOrDefault()?.OldState;
3435

3536
private WorkItem()
3637
{
@@ -119,6 +120,11 @@ public void ClearTimesByState()
119120
_timeByState.Clear();
120121
}
121122

123+
public void RemoveChangeLogItem()
124+
{
125+
ChangeLogItem = null;
126+
}
127+
122128
public void VinculateChangeLogItem(ChangeLogItem changeLogItem)
123129
{
124130
if (changeLogItem == null)
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
using System;
2-
using System.Collections.Generic;
3-
using System.Text;
2+
using System.Text.RegularExpressions;
43

54
namespace AzureDevopsTracker.Helpers
65
{
76
internal static class RawTextHelper
87
{
8+
public static string HtmlToRawText(this string source)
9+
{
10+
source = source.Replace("</div>", "\n");
11+
source = source.Replace("<li>", "\n• ");
12+
source = Regex.Replace(source, "<.*?>|&.*?;", string.Empty, RegexOptions.Compiled, TimeSpan.FromMilliseconds(250));
13+
source = source.Trim().EndsWith(".") ? source[0..^1] : source.Trim();
14+
15+
return source;
16+
}
917
}
1018
}

AzureDevopsTracker/Integrations/DiscordIntegration.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using AzureDevopsTracker.Entities;
2+
using AzureDevopsTracker.Helpers;
3+
using AzureDevopsTracker.Statics;
24
using Newtonsoft.Json;
35
using System;
46
using System.Collections.Generic;
@@ -101,11 +103,14 @@ private IEnumerable<Field> GetText(ChangeLog changeLog)
101103

102104
var listFields = new List<Field>();
103105

104-
var features = changeLogItemsAgrupado.Where(x => !x.Key.Equals("bug")).SelectMany(x => x).Select(x => x).ToList();
105-
var bugFixes = changeLogItemsAgrupado.Where(x => x.Key.Equals("bug")).SelectMany(x => x).Select(x => x).ToList();
106+
var features = changeLogItemsAgrupado.Where(x => !x.Key.Equals(WorkItemStatics.WORKITEM_TYPE_BUG)).SelectMany(x => x).Select(x => x).ToList();
107+
var bugFixes = changeLogItemsAgrupado.Where(x => x.Key.Equals(WorkItemStatics.WORKITEM_TYPE_BUG)).SelectMany(x => x).Select(x => x).ToList();
106108

107-
listFields.Add(new Field() { Name = "Atualizações", Value = string.Join("\n", features.Select(d => string.Format(" {0} - {1}.", d.WorkItemId, d.Description))), IsInline = false });
108-
listFields.Add(new Field() { Name = "Correções", Value = string.Join("\n", bugFixes.Select(d => string.Format(" {0} - {1}.", d.WorkItemId, d.Description))), IsInline = false });
109+
if (features.Any())
110+
listFields.Add(new Field() { Name = "Atualizações", Value = string.Join("\n", features.Select(d => string.Format("\n{0} - {1}", d.WorkItemId, d.Description.HtmlToRawText()))), IsInline = false });
111+
112+
if (bugFixes.Any())
113+
listFields.Add(new Field() { Name = "Correções", Value = string.Join("\n", bugFixes.Select(d => string.Format("\n{0} - {1}", d.WorkItemId, d.Description.HtmlToRawText()))), IsInline = false });
109114

110115
return listFields;
111116
}

AzureDevopsTracker/Integrations/MicrosoftTeamsIntegration.cs

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -66,54 +66,41 @@ private string GetText(ChangeLog changeLog)
6666
{
6767
if (changeLog == null || !changeLog.ChangeLogItems.Any()) return string.Empty;
6868

69-
StringBuilder text = new StringBuilder();
70-
text.Append(GetWorkItemsDescriptionSection("Features", changeLog.ChangeLogItems.Where(x => x.WorkItemType != WorkItemStatics.WORKITEM_TYPE_BUG)));
71-
text.Append(GetWorkItemsDescriptionSection("Correções", changeLog.ChangeLogItems.Where(x => x.WorkItemType == WorkItemStatics.WORKITEM_TYPE_BUG)));
69+
StringBuilder text = new();
70+
text.AppendLine(GetWorkItemsDescriptionSection("Features", changeLog.ChangeLogItems.Where(x => x.WorkItemType != WorkItemStatics.WORKITEM_TYPE_BUG)));
71+
text.AppendLine(GetWorkItemsDescriptionSection("Correções", changeLog.ChangeLogItems.Where(x => x.WorkItemType == WorkItemStatics.WORKITEM_TYPE_BUG)));
7272

73-
text.Append(GetFooter());
73+
text.AppendLine(GetFooter());
7474
return text.ToString();
7575
}
7676

7777
private string GetWorkItemsDescriptionSection(string sectionName, IEnumerable<ChangeLogItem> changeLogItems)
7878
{
79-
StringBuilder text = new StringBuilder();
79+
StringBuilder text = new();
8080
if (!changeLogItems.Any()) return string.Empty;
8181

82-
text.Append("<br>");
83-
text.AppendLine("\n");
84-
85-
text.Append($"\n # **{ sectionName }**\n");
82+
text.AppendLine($"\n# **{ sectionName }**\n");
8683
foreach (var workItem in changeLogItems)
87-
{
88-
text.Append(GetWorkItemDescriptionLine(workItem));
89-
}
84+
text.AppendLine(GetWorkItemDescriptionLine(workItem));
9085

91-
text.Append("<br>");
9286
text.AppendLine("\n");
9387
return text.ToString();
9488
}
9589

9690
private string GetWorkItemDescriptionLine(ChangeLogItem workItem)
9791
{
9892
var description = GetDescription(workItem.Description);
99-
var descriptionLine = $"<em>**{ workItem.WorkItemId }**</em> - { description }";
100-
if (description.Length > MicrosoftTeamsStatics.TEXT_SIZE_TO_BREAK_LINE)
101-
return $"<br>{ descriptionLine }<br>";
102-
return descriptionLine;
93+
return $"<em>**{ workItem.WorkItemId }**</em> - { description } <br>";
10394
}
10495

10596
private string GetDescription(string description)
10697
{
107-
if (description.StartsWith("<div>"))
108-
description = description[MicrosoftTeamsStatics.OPENING_DIV_SIZE..];
109-
if(description.EndsWith("</div>"))
110-
description = description[0..^MicrosoftTeamsStatics.CLOSING_DIV_SIZE];
111-
return description;
98+
return description.Replace("<div>", "").Replace("</div>", "").Replace("<br>", "");
11299
}
113100

114101
private string GetFooter()
115102
{
116-
return $"<br><sup> <img src='{ GetLogoTypingHard16x16Url() }' /> { GetNugetVersion() }</sup>";
103+
return $"<br><sup> <img style='width: 16px; height: 16px;' src='{ GetLogoTypingHard16x16Url() }' /> { GetNugetVersion() }</sup>";
117104
}
118105
}
119106
}

AzureDevopsTracker/Services/AzureDevopsTrackerService.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@ public class AzureDevopsTrackerService : IAzureDevopsTrackerService
1717
{
1818
public readonly IWorkItemRepository _workItemRepository;
1919
public readonly IWorkItemAdapter _workItemAdapter;
20+
public readonly IChangeLogItemRepository _changeLogItemRepository;
2021

2122
public AzureDevopsTrackerService(
22-
IWorkItemAdapter workItemAdapter, IWorkItemRepository workItemRepository)
23+
IWorkItemAdapter workItemAdapter,
24+
IWorkItemRepository workItemRepository,
25+
IChangeLogItemRepository changeLogItemRepository)
2326
{
2427
_workItemAdapter = workItemAdapter;
2528
_workItemRepository = workItemRepository;
29+
_changeLogItemRepository = changeLogItemRepository;
2630
}
2731

2832
public async Task Create(CreateWorkItemDTO create, bool addWorkItemChange = true)
@@ -225,6 +229,12 @@ public void RemoveTimeByStateFromDataBase(WorkItem workItem)
225229

226230
public void CheckWorkItemAvailableToChangeLog(WorkItem workItem, Fields fields)
227231
{
232+
if (workItem.CurrentStatus != "Closed" &&
233+
workItem.LastStatus == "Closed" &&
234+
workItem.ChangeLogItem != null &&
235+
!workItem.ChangeLogItem.WasReleased)
236+
RemoveChangeLogItem(workItem);
237+
228238
if (workItem.CurrentStatus != "Closed" ||
229239
fields.ChangeLogDescription.IsNullOrEmpty())
230240
return;
@@ -250,6 +260,18 @@ public ChangeLogItem ToChangeLogItem(WorkItem workItem, Fields fields)
250260
{
251261
return new ChangeLogItem(workItem.Id, workItem.Title, fields.ChangeLogDescription, workItem.Type);
252262
}
263+
264+
public void RemoveChangeLogItem(WorkItem workItem)
265+
{
266+
var changeLogItem = _changeLogItemRepository.GetById(workItem.ChangeLogItem?.Id).Result;
267+
if (changeLogItem != null)
268+
{
269+
_changeLogItemRepository.Delete(changeLogItem);
270+
_changeLogItemRepository.SaveChangesAsync().Wait();
271+
272+
workItem.RemoveChangeLogItem();
273+
}
274+
}
253275
#endregion
254276
}
255277
}

AzureDevopsTracker/Statics/WorkItemStatics.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Text;
4-
5-
namespace AzureDevopsTracker.Statics
1+
namespace AzureDevopsTracker.Statics
62
{
73
internal class WorkItemStatics
84
{

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,15 @@ The **Azure DevOps Tracker** brings automatically tracking of Workitems and will
3636

3737
✅ A Project
3838

39+
### - Changelog: With Azure DevOps Tracker you can easily inform what was done by your team. Actually, we have integration with Microsoft Teams and Discord!
40+
3941
### Possibility to connect to a BI Tool 📊
4042
### Your creativity is the limit! 🚀
4143

4244

4345
# Installation
4446
```c#
45-
PM > Install-Package AzureDevOpsTracker -Version 1.0.1
47+
PM > Install-Package AzureDevOpsTracker
4648
```
4749
For more instructions and examples, go to our [Wiki](https://github.com/typinghard/azure-devops-tracker/wiki).
4850
- [English](https://github.com/typinghard/azure-devops-tracker/wiki/English) 🇺🇸

0 commit comments

Comments
 (0)