Skip to content

Commit 8c04749

Browse files
committed
Updating custom fields data context
1 parent 1c0a015 commit 8c04749

File tree

7 files changed

+60
-85
lines changed

7 files changed

+60
-85
lines changed

AzureDevopsTracker/Data/Context/AzureDevopsTrackerContext.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public AzureDevopsTrackerContext(DbContextOptions options) : base(options)
1515
public DbSet<TimeByState> TimeByStates { get; set; }
1616
public DbSet<ChangeLogItem> ChangeLogItems { get; set; }
1717
public DbSet<ChangeLog> ChangeLogs { get; set; }
18+
public DbSet<WorkItemCustomField> CustomFields { get; set; }
1819

1920
protected override void OnModelCreating(ModelBuilder modelBuilder)
2021
{

AzureDevopsTracker/Data/Mapping/ChangeLogMapping.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ public void Configure(EntityTypeBuilder<ChangeLog> builder)
1212
.HasColumnType("varchar(max)");
1313
}
1414
}
15-
}
15+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using AzureDevopsTracker.Entities;
2+
using Microsoft.EntityFrameworkCore;
3+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
4+
5+
namespace AzureDevopsTracker.Data.Mapping
6+
{
7+
public class WorkItemCustomFieldMapping : IEntityTypeConfiguration<WorkItemCustomField>
8+
{
9+
public void Configure(EntityTypeBuilder<WorkItemCustomField> builder)
10+
{
11+
builder.HasKey(k => new { k.WorkItemId, k.Key });
12+
}
13+
}
14+
}

AzureDevopsTracker/Entities/WorkItem.cs

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ public class WorkItem : Entity
2525

2626
public ChangeLogItem ChangeLogItem { get; private set; }
2727

28-
private readonly List<WorkItemChange> _workItemsChanges = new List<WorkItemChange>();
28+
private readonly List<WorkItemChange> _workItemsChanges = new();
2929
public IReadOnlyCollection<WorkItemChange> WorkItemsChanges => _workItemsChanges;
3030

31-
private readonly List<TimeByState> _timeByState = new List<TimeByState>();
31+
private readonly List<TimeByState> _timeByState = new();
3232
public IReadOnlyCollection<TimeByState> TimeByStates => _timeByState;
3333

34-
private readonly List<WorkItemCustomField> _workItemCustomFields = new List<WorkItemCustomField>();
34+
private readonly List<WorkItemCustomField> _workItemCustomFields = new();
3535
public IReadOnlyCollection<WorkItemCustomField> CustomFields => _workItemCustomFields;
3636
public string CurrentStatus => _workItemsChanges?.OrderBy(x => x.CreatedAt)?.LastOrDefault()?.NewState;
3737
public string LastStatus => _workItemsChanges?.OrderBy(x => x.CreatedAt)?.ToList()?.Skip(1)?.LastOrDefault()?.OldState;
@@ -117,9 +117,6 @@ public void AddCustomField(WorkItemCustomField customField)
117117
if (customField is null)
118118
throw new ArgumentException("CustomField is null");
119119

120-
if (customField.WorkItemId.IsNullOrEmpty())
121-
customField.LinkWorkItem(Id);
122-
123120
_workItemCustomFields.Add(customField);
124121
}
125122

@@ -137,20 +134,8 @@ public void UpdateCustomFields(IEnumerable<WorkItemCustomField> newCustomFields)
137134
if (newCustomFields is not null && !newCustomFields.Any())
138135
return;
139136

140-
var customFieldsToAdd = newCustomFields.Where(x => !_workItemCustomFields.Select(x => x.Key).Contains(x.Key));
141-
AddCustomFields(customFieldsToAdd);
142-
143-
var customFieldsToUpdate = newCustomFields.Where(x => _workItemCustomFields.Select(x => x.Key).Contains(x.Key));
144-
foreach (var newCustomField in customFieldsToUpdate)
145-
{
146-
var customField = _workItemCustomFields.FirstOrDefault(x => x.Key == newCustomField.Key);
147-
if (customField is null) continue;
148-
149-
if (customField.WorkItemId.IsNullOrEmpty())
150-
customField.LinkWorkItem(Id);
151-
152-
customField.Update(customField.Value);
153-
}
137+
_workItemCustomFields.Clear();
138+
AddCustomFields(newCustomFields);
154139
}
155140

156141
public void ClearTimesByState()

AzureDevopsTracker/Entities/WorkItemCustomField.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,6 @@ public WorkItemCustomField(string workItemId, string key, string value)
1818
Value = value;
1919
}
2020

21-
public void LinkWorkItem(string workItemId)
22-
{
23-
if (workItemId.IsNullOrEmpty())
24-
throw new ArgumentException("WorkItemId is required");
25-
26-
WorkItemId = workItemId;
27-
}
28-
2921
public void Update(string value)
3022
{
3123
Value = value;

AzureDevopsTracker/Interfaces/IAzureDevopsTrackerService.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,5 @@ public interface IAzureDevopsTrackerService
1414
Task Delete(DeleteWorkItemDTO deleteDto);
1515
Task Restore(RestoreWorkItemDTO restoreDto);
1616
Task<WorkItemDTO> GetByWorkItemId(string workItemId);
17-
18-
Task Create(string jsonText, bool addWorkItemChange = true);
19-
Task Update(string jsonText);
2017
}
2118
}

AzureDevopsTracker/Services/AzureDevopsTrackerService.cs

Lines changed: 39 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
using AzureDevopsTracker.Helpers;
99
using AzureDevopsTracker.Interfaces;
1010
using AzureDevopsTracker.Interfaces.Internals;
11+
using Microsoft.AspNetCore.Http;
12+
using Microsoft.Extensions.DependencyInjection;
1113
using Newtonsoft.Json;
1214
using System;
1315
using System.Linq;
@@ -20,15 +22,18 @@ public class AzureDevopsTrackerService : IAzureDevopsTrackerService
2022
public readonly IWorkItemRepository _workItemRepository;
2123
public readonly IWorkItemAdapter _workItemAdapter;
2224
public readonly IChangeLogItemRepository _changeLogItemRepository;
25+
private readonly IServiceScopeFactory _serviceScopeFactory;
2326

2427
public AzureDevopsTrackerService(
2528
IWorkItemAdapter workItemAdapter,
2629
IWorkItemRepository workItemRepository,
27-
IChangeLogItemRepository changeLogItemRepository)
30+
IChangeLogItemRepository changeLogItemRepository,
31+
IServiceScopeFactory serviceScopeFactory)
2832
{
2933
_workItemAdapter = workItemAdapter;
3034
_workItemRepository = workItemRepository;
3135
_changeLogItemRepository = changeLogItemRepository;
36+
_serviceScopeFactory = serviceScopeFactory;
3237
}
3338

3439
public async Task Create(CreateWorkItemDTO create, bool addWorkItemChange = true)
@@ -55,6 +60,8 @@ public async Task Create(CreateWorkItemDTO create, bool addWorkItemChange = true
5560

5661
CheckWorkItemAvailableToChangeLog(workItem, create.Resource.Fields);
5762

63+
ManipulateCustomFields(workItem);
64+
5865
await _workItemRepository.Add(workItem);
5966
await _workItemRepository.SaveChangesAsync();
6067
}
@@ -101,6 +108,8 @@ public async Task Update(UpdatedWorkItemDTO update)
101108

102109
CheckWorkItemAvailableToChangeLog(workItem, update.Resource.Revision.Fields);
103110

111+
ManipulateCustomFields(workItem);
112+
104113
_workItemRepository.Update(workItem);
105114
await _workItemRepository.SaveChangesAsync();
106115
}
@@ -131,6 +140,8 @@ public async Task Delete(DeleteWorkItemDTO delete)
131140
delete.Resource.Fields.Activity,
132141
delete.Resource.Fields.Lancado);
133142

143+
ManipulateCustomFields(workItem);
144+
134145
_workItemRepository.Update(workItem);
135146
await _workItemRepository.SaveChangesAsync();
136147
}
@@ -161,6 +172,8 @@ public async Task Restore(RestoreWorkItemDTO restore)
161172
restore.Resource.Fields.Activity,
162173
restore.Resource.Fields.Lancado);
163174

175+
ManipulateCustomFields(workItem);
176+
164177
_workItemRepository.Update(workItem);
165178
await _workItemRepository.SaveChangesAsync();
166179
}
@@ -175,6 +188,31 @@ public async Task<WorkItemDTO> GetByWorkItemId(string workItemId)
175188
}
176189

177190
#region Support Methods
191+
public void ManipulateCustomFields(WorkItem workItem)
192+
{
193+
try
194+
{
195+
var json = GetRequestBody();
196+
if (json.IsNullOrEmpty())
197+
return;
198+
199+
var customFields = ReadJsonHelper.ReadJson(workItem.Id, json);
200+
if (customFields is null || !customFields.Any())
201+
return;
202+
203+
workItem.UpdateCustomFields(customFields);
204+
}
205+
catch
206+
{ }
207+
}
208+
209+
public string GetRequestBody()
210+
{
211+
using var scope = _serviceScopeFactory.CreateScope();
212+
var httpContext = scope.ServiceProvider.GetService<IHttpContextAccessor>();
213+
return httpContext?.HttpContext?.Request?.Body?.ToString();
214+
}
215+
178216
public WorkItemChange ToWorkItemChange(
179217
string workItemId, string changedBy,
180218
string iterationPath, DateTime newDate, string newState,
@@ -274,58 +312,6 @@ public void RemoveChangeLogItem(WorkItem workItem)
274312
workItem.RemoveChangeLogItem();
275313
}
276314
}
277-
278-
/*
279-
* Still missing:
280-
* - Migration
281-
*/
282-
public async Task Create(string jsonText, bool addWorkItemChange = true)
283-
{
284-
try
285-
{
286-
var workItemDTO = JsonConvert.DeserializeObject<CreateWorkItemDTO>(jsonText);
287-
await Create(workItemDTO);
288-
289-
var workItem = await _workItemRepository.GetByWorkItemId(workItemDTO.Resource.Id);
290-
if (workItem is null)
291-
return;
292-
293-
var customFields = ReadJsonHelper.ReadJson(workItem.Id, jsonText);
294-
if (customFields is null || !customFields.Any())
295-
return;
296-
297-
workItem.AddCustomFields(customFields);
298-
299-
_workItemRepository.Update(workItem);
300-
await _workItemRepository.SaveChangesAsync();
301-
}
302-
catch
303-
{ }
304-
}
305-
306-
public async Task Update(string jsonText)
307-
{
308-
try
309-
{
310-
var workItemDTO = JsonConvert.DeserializeObject<UpdatedWorkItemDTO>(jsonText);
311-
await Update(workItemDTO);
312-
313-
var workItem = await _workItemRepository.GetByWorkItemId(workItemDTO.Resource.WorkItemId);
314-
if (workItem is null)
315-
return;
316-
317-
var customFields = ReadJsonHelper.ReadJson(workItem.Id, jsonText);
318-
if (customFields is null || !customFields.Any())
319-
return;
320-
321-
workItem.UpdateCustomFields(customFields);
322-
323-
_workItemRepository.Update(workItem);
324-
await _workItemRepository.SaveChangesAsync();
325-
}
326-
catch
327-
{ }
328-
}
329315
#endregion
330316
}
331317
}

0 commit comments

Comments
 (0)