Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Updating
  • Loading branch information
DiegoGalante committed Jul 19, 2021
commit f761d5f2c7a21c53a5650b7d1154bd86b30f4c1e
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ VisualStudioVersion = 16.0.31229.75
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AzureDevOpsStateTracker.Functions", "AzureDevOpsStateTracker.Functions.csproj", "{3C86C085-C8C6-46BB-8315-D4348928034C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AzureDevopsStateTracker", "..\..\azure-devops-state-tracker\AzureDevopsStateTracker\AzureDevopsStateTracker.csproj", "{E71EE8C3-7D74-4C91-B244-2394160F7486}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -17,10 +15,6 @@ Global
{3C86C085-C8C6-46BB-8315-D4348928034C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C86C085-C8C6-46BB-8315-D4348928034C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C86C085-C8C6-46BB-8315-D4348928034C}.Release|Any CPU.Build.0 = Release|Any CPU
{E71EE8C3-7D74-4C91-B244-2394160F7486}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E71EE8C3-7D74-4C91-B244-2394160F7486}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E71EE8C3-7D74-4C91-B244-2394160F7486}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E71EE8C3-7D74-4C91-B244-2394160F7486}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
109 changes: 109 additions & 0 deletions AzureDevopsStateTracker/Adapters/WorkItemAdapter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
using AzureDevopsStateTracker.DTOs;
using AzureDevopsStateTracker.Entities;
using AzureDevopsStateTracker.Interfaces;
using System.Collections.Generic;
using System.Linq;

namespace AzureDevopsStateTracker.Adapters
{
internal class WorkItemAdapter : IWorkItemAdapter
{
public WorkItemDTO ToWorkItemDTO(WorkItem workItem)
{
if (workItem == null) return null;

return new WorkItemDTO()
{
Id = workItem.Id,
CreatedAt = workItem.CreatedAt,
AssignedTo = workItem.AssignedTo,
CreatedBy = workItem.CreatedBy,
CurrentStatus = workItem.CurrentStatus,
TeamProject = workItem.TeamProject,
AreaPath = workItem.AreaPath,
IterationPath = workItem.IterationPath,
Title = workItem.Title,
Type = workItem.Type,
Effort = workItem.Effort,
StoryPoints = workItem.StoryPoints,
OriginalEstimate = workItem.OriginalEstimate,
WorkItemParentId = workItem.WorkItemParentId,
Activity = workItem.Activity,
Tags = workItem.Tags == null ? new List<string>() : workItem.Tags.Split(';').ToList(),
WorkItemsChangesDTO = ToWorkItemsChangeDTO(workItem.WorkItemsChanges.OrderBy(x => x.CreatedAt).ToList()),
TimesByStateDTO = ToTimeByStatesDTO(workItem.CalculateTotalTimeByState().ToList()),
};
}

public List<WorkItemDTO> ToWorkItemsDTO(List<WorkItem> workItems)
{
var workItemsDTO = new List<WorkItemDTO>();

if (workItems == null) return workItemsDTO;

workItems.ForEach(
workItem =>
workItemsDTO.Add(ToWorkItemDTO(workItem)));

return workItemsDTO
.ToList();
}

public WorkItemChangeDTO ToWorkItemChangeDTO(WorkItemChange workIteChange)
{
if (workIteChange == null) return null;

return new WorkItemChangeDTO()
{
NewDate = workIteChange.NewDate,
NewState = workIteChange.NewState,
OldState = workIteChange.OldState,
OldDate = workIteChange.OldDate,
ChangedBy = workIteChange.ChangedBy
};
}

public List<WorkItemChangeDTO> ToWorkItemsChangeDTO(List<WorkItemChange> workItemsChanges)
{
var workItemsChangeDTO = new List<WorkItemChangeDTO>();

if (workItemsChanges == null) return workItemsChangeDTO;

workItemsChanges.ForEach(
workItemsChange =>
workItemsChangeDTO.Add(ToWorkItemChangeDTO(workItemsChange)));

return workItemsChangeDTO
.Where(w => w != null)
.ToList();
}

public TimeByStateDTO ToTimeByStateDTO(TimeByState workItemStatusTime)
{
if (workItemStatusTime == null) return null;

return new TimeByStateDTO()
{
CreatedAt = workItemStatusTime.CreatedAt,
State = workItemStatusTime.State,
//TotalTime = workItemStatusTime.TotalTimeText,
//TotalWorkedTime = workItemStatusTime.TotalWorkedTimeText
};
}

public List<TimeByStateDTO> ToTimeByStatesDTO(List<TimeByState> workItemStatusTimes)
{
var workItemStatusTimeDTO = new List<TimeByStateDTO>();

if (workItemStatusTimes == null) return workItemStatusTimeDTO;

workItemStatusTimes.ForEach(
workItemStatusTime =>
workItemStatusTimeDTO.Add(ToTimeByStateDTO(workItemStatusTime)));

return workItemStatusTimeDTO
.Where(w => w != null)
.ToList();
}
}
}
13 changes: 13 additions & 0 deletions AzureDevopsStateTracker/AzureDevopsStateTracker.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.16" />
</ItemGroup>

</Project>
25 changes: 25 additions & 0 deletions AzureDevopsStateTracker/AzureDevopsStateTracker.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31402.337
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AzureDevopsStateTracker", "AzureDevopsStateTracker.csproj", "{E00DFF81-08B1-4A71-82C4-7CED951299BE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E00DFF81-08B1-4A71-82C4-7CED951299BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E00DFF81-08B1-4A71-82C4-7CED951299BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E00DFF81-08B1-4A71-82C4-7CED951299BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E00DFF81-08B1-4A71-82C4-7CED951299BE}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {53133A2B-5357-47B5-A1C4-30953F789623}
EndGlobalSection
EndGlobal
37 changes: 37 additions & 0 deletions AzureDevopsStateTracker/Configurations/Configuration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using AzureDevopsStateTracker.Adapters;
using AzureDevopsStateTracker.Data;
using AzureDevopsStateTracker.Data.Context;
using AzureDevopsStateTracker.Interfaces;
using AzureDevopsStateTracker.Interfaces.Internals;
using AzureDevopsStateTracker.Services;
using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;

namespace AzureDevopsStateTracker.Configurations
{
public static class Configuration
{
public static IServiceCollection AddAzureDevopsStateTracker(this IServiceCollection services, DataBaseConfig configurations)
{
services.AddDbContext<AzureDevopsStateTrackerContext>(options =>
options.UseSqlServer(DataBaseConfig.ConnectionsString));

services.AddScoped<AzureDevopsStateTrackerContext>();
services.AddScoped<IWorkItemAdapter, WorkItemAdapter>();
services.AddScoped<IWorkItemRepository, WorkItemRepository>();
services.AddScoped<IAzureDevopsStateTrackerService, AzureDevopsStateTrackerService>();

return services;
}

public static IApplicationBuilder UseAzureDevopsStateTracker(this IApplicationBuilder app, IServiceProvider serviceProvider)
{
var context = serviceProvider.GetService<AzureDevopsStateTrackerContext>();
context.Database.Migrate();

return app;
}
}
}
19 changes: 19 additions & 0 deletions AzureDevopsStateTracker/DTOs/Create/CreateWorkItemDTO.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using Newtonsoft.Json;

namespace AzureDevopsStateTracker.DTOs.Create
{
public class CreateWorkItemDTO
{
[JsonProperty("resource")]
public Resource Resource { get; set; }
}

public class Resource
{
[JsonProperty("id")]
public string Id { get; set; }

[JsonProperty("fields")]
public Fields Fields { get; set; }
}
}
59 changes: 59 additions & 0 deletions AzureDevopsStateTracker/DTOs/Fields.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
using Newtonsoft.Json;
using System;

namespace AzureDevopsStateTracker.DTOs
{
public class Fields
{
[JsonProperty("System.AreaPath")]
public string AreaPath { get; set; }

[JsonProperty("System.TeamProject")]
public string TeamProject { get; set; }

[JsonProperty("System.IterationPath")]
public string IterationPath { get; set; }

[JsonProperty("System.AssignedTo")]
public string AssignedTo { get; set; }

[JsonProperty("System.WorkItemType")]
public string Type { get; set; }

[JsonProperty("System.CreatedDate")]
public DateTime CreatedDate { get; set; }

[JsonProperty("System.CreatedBy")]
public string CreatedBy { get; set; }

[JsonProperty("System.ChangedBy")]
public string ChangedBy { get; set; }

[JsonProperty("System.State")]
public string State { get; set; }

[JsonProperty("System.Title")]
public string Title { get; set; }

[JsonProperty("System.Tags")]
public string Tags { get; set; }

[JsonProperty("System.Parent")]
public string Parent { get; set; }

[JsonProperty("Microsoft.VSTS.Scheduling.StoryPoints")]
public string StoryPoints { get; set; }

[JsonProperty("Microsoft.VSTS.Scheduling.OriginalEstimate")]
public string OriginalEstimate { get; set; }

[JsonProperty("Microsoft.VSTS.Scheduling.RemainingWork")]
public string RemainingWork { get; set; }

[JsonProperty("Microsoft.VSTS.Scheduling.Effort")]
public string Effort { get; set; }

[JsonProperty("Microsoft.VSTS.Common.Activity")]
public string Activity { get; set; }
}
}
68 changes: 68 additions & 0 deletions AzureDevopsStateTracker/DTOs/Update/UpdateWorkItemDTO.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using Newtonsoft.Json;
using System;

namespace AzureDevopsStateTracker.DTOs.Update
{
public class UpdatedWorkItemDTO
{
[JsonProperty("resource")]
public Resource Resource { get; set; }
}

public class Resource
{
[JsonProperty("workItemId")]
public string WorkItemId { get; set; }

[JsonProperty("fields")]
public ResourceFields Fields { get; set; }

[JsonProperty("revision")]
public Revision Revision { get; set; }
}

public class Revision
{
[JsonProperty("fields")]
public Fields Fields { get; set; }
}

public class ResourceFields
{
[JsonProperty("System.State")]
public OldNewValues State { get; set; }

[JsonProperty("Microsoft.VSTS.Common.StateChangeDate")]
public DateTimeOldNewValues StateChangeDate { get; set; }

[JsonProperty("System.ChangedBy")]
public ChangedByOldNewValues ChangedBy { get; set; }
}

public class OldNewValues
{
[JsonProperty("oldValue")]
public string OldValue { get; set; }

[JsonProperty("newValue")]
public string NewValue { get; set; }
}

public class DateTimeOldNewValues
{
[JsonProperty("oldValue")]
public DateTime OldValue { get; set; }

[JsonProperty("newValue")]
public DateTime NewValue { get; set; }
}

public class ChangedByOldNewValues
{
[JsonProperty("oldValue")]
public string OldValue { get; set; }

[JsonProperty("newValue")]
public string NewValue { get; set; }
}
}
Loading