diff --git a/AzureDevOpsStateTracker.Functions/AzureDevOpsStateTracker.Functions.csproj b/AzureDevOpsStateTracker.Functions/AzureDevOpsStateTracker.Functions.csproj
index f83a1ab..264a135 100644
--- a/AzureDevOpsStateTracker.Functions/AzureDevOpsStateTracker.Functions.csproj
+++ b/AzureDevOpsStateTracker.Functions/AzureDevOpsStateTracker.Functions.csproj
@@ -3,23 +3,14 @@
netcoreapp3.1
v3
035287d5-0b94-46fd-b3a9-b927fdb7b8ed
+ true
+
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
-
-
-
PreserveNewest
diff --git a/AzureDevOpsStateTracker.Functions/AzureDevOpsStateTracker.Functions.sln b/AzureDevOpsStateTracker.Functions/AzureDevOpsStateTracker.Functions.sln
index da8e283..ba1c1f3 100644
--- a/AzureDevOpsStateTracker.Functions/AzureDevOpsStateTracker.Functions.sln
+++ b/AzureDevOpsStateTracker.Functions/AzureDevOpsStateTracker.Functions.sln
@@ -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", "..\AzureDevopsStateTracker\AzureDevopsStateTracker.csproj", "{9F58B2EA-6594-41E5-8BAD-DAC7DF9CADA7}"
-EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -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
- {9F58B2EA-6594-41E5-8BAD-DAC7DF9CADA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {9F58B2EA-6594-41E5-8BAD-DAC7DF9CADA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9F58B2EA-6594-41E5-8BAD-DAC7DF9CADA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9F58B2EA-6594-41E5-8BAD-DAC7DF9CADA7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/AzureDevOpsStateTracker.Functions/WorkItemFunctions.cs b/AzureDevOpsStateTracker.Functions/WorkItemFunctions.cs
index a1aae65..e55f829 100644
--- a/AzureDevOpsStateTracker.Functions/WorkItemFunctions.cs
+++ b/AzureDevOpsStateTracker.Functions/WorkItemFunctions.cs
@@ -1,30 +1,31 @@
+using AzureDevOpsStateTracker.Functions.Extensions;
+using AzureDevopsTracker.DTOs.Create;
+using AzureDevopsTracker.DTOs.Update;
+using AzureDevopsTracker.Services;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
-using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
-using AzureDevopsStateTracker.Services;
-using AzureDevOpsStateTracker.Functions.Extensions;
using Newtonsoft.Json;
-using AzureDevopsStateTracker.DTOs.Create;
-using AzureDevopsStateTracker.DTOs.Update;
-using System.Net;
using System;
+using System.Net;
+using System.Threading.Tasks;
-namespace AzureDevOpsStateTracker.Functions
+namespace AzureDevOpsTracker.Functions
{
public class WorkItemFunctions
{
- private readonly AzureDevopsStateTrackerService _azureDevopsStateTrackerService;
+ private readonly AzureDevopsTrackerService _azureDevopsTrackerService;
public WorkItemFunctions(
- AzureDevopsStateTrackerService azureDevopsStateTrackerService)
+ AzureDevopsTrackerService azureDevopsTrackerService)
{
- _azureDevopsStateTrackerService = azureDevopsStateTrackerService;
+ _azureDevopsTrackerService = azureDevopsTrackerService;
}
[FunctionName("workitem")]
- public IActionResult Create(
+ public async Task Create(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
ILogger log)
{
@@ -32,7 +33,7 @@ public IActionResult Create(
try
{
var workItemDTO = JsonConvert.DeserializeObject(req.GetBody());
- _azureDevopsStateTrackerService.Create(workItemDTO);
+ await _azureDevopsTrackerService.Create(workItemDTO);
}
catch (Exception ex)
{
@@ -43,14 +44,14 @@ public IActionResult Create(
}
[FunctionName("workitem-update")]
- public IActionResult Update(
+ public async Task Update(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
ILogger log)
{
try
{
var workItemDTO = JsonConvert.DeserializeObject(req.GetBody());
- _azureDevopsStateTrackerService.Update(workItemDTO);
+ await _azureDevopsTrackerService.Update(workItemDTO);
}
catch (Exception ex)
{
diff --git a/AzureDevopsStateTracker/Adapters/WorkItemAdapter.cs b/AzureDevopsStateTracker/Adapters/WorkItemAdapter.cs
deleted file mode 100644
index 904f362..0000000
--- a/AzureDevopsStateTracker/Adapters/WorkItemAdapter.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-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() : workItem.Tags.Split(';').ToList(),
- WorkItemsChangesDTO = ToWorkItemsChangeDTO(workItem.WorkItemsChanges.OrderBy(x => x.CreatedAt).ToList()),
- TimesByStateDTO = ToTimeByStatesDTO(workItem.CalculateTotalTimeByState().ToList()),
- };
- }
-
- public List ToWorkItemsDTO(List workItems)
- {
- var workItemsDTO = new List();
-
- 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 ToWorkItemsChangeDTO(List workItemsChanges)
- {
- var workItemsChangeDTO = new List();
-
- 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 ToTimeByStatesDTO(List workItemStatusTimes)
- {
- var workItemStatusTimeDTO = new List();
-
- if (workItemStatusTimes == null) return workItemStatusTimeDTO;
-
- workItemStatusTimes.ForEach(
- workItemStatusTime =>
- workItemStatusTimeDTO.Add(ToTimeByStateDTO(workItemStatusTime)));
-
- return workItemStatusTimeDTO
- .Where(w => w != null)
- .ToList();
- }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/AzureDevopsStateTracker.csproj b/AzureDevopsStateTracker/AzureDevopsStateTracker.csproj
deleted file mode 100644
index 647ec7b..0000000
--- a/AzureDevopsStateTracker/AzureDevopsStateTracker.csproj
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
- netcoreapp3.1
- false
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/AzureDevopsStateTracker.sln b/AzureDevopsStateTracker/AzureDevopsStateTracker.sln
deleted file mode 100644
index 1a63535..0000000
--- a/AzureDevopsStateTracker/AzureDevopsStateTracker.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-
-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
diff --git a/AzureDevopsStateTracker/Configurations/Configuration.cs b/AzureDevopsStateTracker/Configurations/Configuration.cs
deleted file mode 100644
index a20ca36..0000000
--- a/AzureDevopsStateTracker/Configurations/Configuration.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-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(options =>
- options.UseSqlServer(DataBaseConfig.ConnectionsString));
-
- services.AddScoped();
- services.AddScoped();
- services.AddScoped();
- services.AddScoped();
-
- return services;
- }
-
- public static IApplicationBuilder UseAzureDevopsStateTracker(this IApplicationBuilder app, IServiceProvider serviceProvider)
- {
- var context = serviceProvider.GetService();
- context.Database.Migrate();
-
- return app;
- }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/DTOs/Create/CreateWorkItemDTO.cs b/AzureDevopsStateTracker/DTOs/Create/CreateWorkItemDTO.cs
deleted file mode 100644
index e6282cd..0000000
--- a/AzureDevopsStateTracker/DTOs/Create/CreateWorkItemDTO.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-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; }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/DTOs/Fields.cs b/AzureDevopsStateTracker/DTOs/Fields.cs
deleted file mode 100644
index 1351315..0000000
--- a/AzureDevopsStateTracker/DTOs/Fields.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-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; }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/DTOs/Update/UpdateWorkItemDTO.cs b/AzureDevopsStateTracker/DTOs/Update/UpdateWorkItemDTO.cs
deleted file mode 100644
index d0ba441..0000000
--- a/AzureDevopsStateTracker/DTOs/Update/UpdateWorkItemDTO.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-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; }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/DTOs/WorkItemDTO.cs b/AzureDevopsStateTracker/DTOs/WorkItemDTO.cs
deleted file mode 100644
index d9990a4..0000000
--- a/AzureDevopsStateTracker/DTOs/WorkItemDTO.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using Newtonsoft.Json;
-using System;
-using System.Collections.Generic;
-
-namespace AzureDevopsStateTracker.DTOs
-{
- public class WorkItemDTO
- {
- [JsonProperty("id")]
- public string Id { get; set; }
-
- [JsonProperty("created_at")]
- public DateTime CreatedAt { get; set; }
-
- [JsonProperty("assigned_to")]
- public string AssignedTo { get; set; }
-
- [JsonProperty("type")]
- public string Type { get; set; }
-
- [JsonProperty("effort")]
- public string Effort { get; set; }
-
- [JsonProperty("story_points")]
- public string StoryPoints { get; set; }
-
- [JsonProperty("original_estimate")]
- public string OriginalEstimate { get; set; }
-
- [JsonProperty("created_by")]
- public string CreatedBy { get; set; }
-
- [JsonProperty("title")]
- public string Title { get; set; }
-
- [JsonProperty("team_project")]
- public string TeamProject { get; set; }
-
- [JsonProperty("iteration_path")]
- public string IterationPath { get; set; }
-
- [JsonProperty("area_path")]
- public string AreaPath { get; set; }
-
- [JsonProperty("current_status")]
- public string CurrentStatus { get; set; }
-
- [JsonProperty("work_item_parent_id")]
- public string WorkItemParentId { get; set; }
-
- [JsonProperty("activity")]
- public string Activity { get; set; }
-
- [JsonProperty("tags")]
- public IEnumerable Tags { get; set; }
-
- [JsonProperty("workItems_changes")]
- public List WorkItemsChangesDTO { get; set; }
-
- [JsonProperty("times_by_state")]
- public List TimesByStateDTO { get; set; }
- }
-
- public class WorkItemChangeDTO
- {
- [JsonProperty("new_date")]
- public DateTime NewDate { get; set; }
-
- [JsonProperty("new_state")]
- public string NewState { get; set; }
-
- [JsonProperty("old_state")]
- public string OldState { get; set; }
-
- [JsonProperty("old_date")]
- public DateTime? OldDate { get; set; }
-
- [JsonProperty("changed_by")]
- public string ChangedBy { get; set; }
- }
-
-
- public class TimeByStateDTO
- {
- [JsonProperty("created_at")]
- public DateTime CreatedAt { get; set; }
-
- [JsonProperty("updated_at")]
- public DateTime UpdatedAt { get; set; }
-
- [JsonProperty("state")]
- public string State { get; set; }
-
- [JsonProperty("total_time")]
- public string TotalTime { get; set; }
-
- [JsonProperty("total_worked_time")]
- public string TotalWorkedTime { get; set; }
- }
-}
diff --git a/AzureDevopsStateTracker/Data/Context/AzureDevopsStateTrackerContext.cs b/AzureDevopsStateTracker/Data/Context/AzureDevopsStateTrackerContext.cs
deleted file mode 100644
index 18113a6..0000000
--- a/AzureDevopsStateTracker/Data/Context/AzureDevopsStateTrackerContext.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using AzureDevopsStateTracker.Entities;
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.Linq;
-
-namespace AzureDevopsStateTracker.Data.Context
-{
- public class AzureDevopsStateTrackerContext : DbContext, IDisposable
- {
- public AzureDevopsStateTrackerContext(DbContextOptions options) : base(options)
- { }
-
- public DbSet WorkItems { get; set; }
- public DbSet WorkItemsChange { get; set; }
- public DbSet TimeByStates { get; set; }
-
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- foreach (var property in modelBuilder.Model.GetEntityTypes().SelectMany(
- e => e.GetProperties().Where(p => p.ClrType == typeof(string))))
- property.SetColumnType("varchar(200)");
-
- modelBuilder.HasDefaultSchema(DataBaseConfig.SchemaName);
- }
-
- protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
- {
- if (!optionsBuilder.IsConfigured)
- optionsBuilder.UseSqlServer(DataBaseConfig.ConnectionsString);
- }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/Data/DataBaseConfig.cs b/AzureDevopsStateTracker/Data/DataBaseConfig.cs
deleted file mode 100644
index fbf1079..0000000
--- a/AzureDevopsStateTracker/Data/DataBaseConfig.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using AzureDevopsStateTracker.Extensions;
-using System;
-
-namespace AzureDevopsStateTracker.Data
-{
- public class DataBaseConfig
- {
- public DataBaseConfig(string connectionsString, string schemaName = "dbo")
- {
- if (connectionsString.IsNullOrEmpty())
- throw new ArgumentException("The ConnectionsString is required");
-
- ConnectionsString = connectionsString;
- SchemaName = schemaName;
- }
-
- public static string ConnectionsString { get; private set; }
- public static string SchemaName { get; private set; }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/Data/Repository.cs b/AzureDevopsStateTracker/Data/Repository.cs
deleted file mode 100644
index 23d4673..0000000
--- a/AzureDevopsStateTracker/Data/Repository.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using AzureDevopsStateTracker.Data.Context;
-using AzureDevopsStateTracker.Entities;
-using AzureDevopsStateTracker.Interfaces.Internals;
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace AzureDevopsStateTracker.Data
-{
- internal abstract class Repository : IRepository where TEntity : Entity
- {
- protected readonly AzureDevopsStateTrackerContext Db;
- protected readonly DbSet DbSet;
-
- public Repository(AzureDevopsStateTrackerContext db)
- {
- Db = db;
- DbSet = db.Set();
- }
-
- public virtual void Add(TEntity entity)
- {
- DbSet.Add(entity);
- }
-
- public virtual void Add(IEnumerable entities)
- {
- DbSet.AddRange(entities);
- }
-
- public virtual void Update(TEntity entity)
- {
- DbSet.Update(entity);
- }
-
- public virtual void Update(IEnumerable entities)
- {
- DbSet.UpdateRange(entities);
- }
-
- public virtual void Delete(TEntity entity)
- {
- DbSet.Remove(entity);
- }
-
- public virtual TEntity GetById(string id)
- {
- return DbSet
- .Where(x => x.Id == id)
- .FirstOrDefault();
- }
-
- public bool Exist(string id)
- {
- return DbSet
- .Any(x => x.Id == id);
- }
-
- public void SaveChanges()
- {
- Db.SaveChanges();
- }
-
- public void Dispose()
- {
- GC.SuppressFinalize(this);
- }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/Data/WorkItemRepository.cs b/AzureDevopsStateTracker/Data/WorkItemRepository.cs
deleted file mode 100644
index 853f884..0000000
--- a/AzureDevopsStateTracker/Data/WorkItemRepository.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using AzureDevopsStateTracker.Data.Context;
-using AzureDevopsStateTracker.Entities;
-using AzureDevopsStateTracker.Interfaces.Internals;
-using Microsoft.EntityFrameworkCore;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace AzureDevopsStateTracker.Data
-{
- internal class WorkItemRepository : Repository, IWorkItemRepository
- {
- public WorkItemRepository(AzureDevopsStateTrackerContext context) : base(context) { }
-
- public WorkItem GetByWorkItemId(string workItemId)
- {
- return DbSet
- .Include(x => x.WorkItemsChanges)
- .Include(x => x.TimeByStates)
- .FirstOrDefault(x => x.Id == workItemId);
- }
-
- public IEnumerable ListByWorkItemId(IEnumerable workItemsId)
- {
- return DbSet
- .Include(x => x.WorkItemsChanges)
- .Include(x => x.TimeByStates)
- .Where(x => workItemsId.Contains(x.Id));
- }
-
- public IEnumerable ListByIterationPath(string iterationPath)
- {
- return DbSet
- .Include(x => x.WorkItemsChanges)
- .Include(x => x.TimeByStates)
- .Where(x => x.IterationPath == iterationPath);
- }
-
- public void RemoveAllTimeByState(List timeByStates)
- {
- Db.TimeByStates.RemoveRange(timeByStates);
- }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/Entities/Entity.cs b/AzureDevopsStateTracker/Entities/Entity.cs
deleted file mode 100644
index 4f50888..0000000
--- a/AzureDevopsStateTracker/Entities/Entity.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System;
-
-namespace AzureDevopsStateTracker.Entities
-{
- public abstract class Entity
- {
- public string Id { get; protected set; }
- public DateTime CreatedAt { get; private set; }
- public Entity(string id)
- {
- Id = id;
- CreatedAt = DateTime.UtcNow;
- }
-
- public Entity()
- {
- Id = Guid.NewGuid().ToString();
- CreatedAt = DateTime.UtcNow;
- }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/Entities/TimeByState.cs b/AzureDevopsStateTracker/Entities/TimeByState.cs
deleted file mode 100644
index 4145ebb..0000000
--- a/AzureDevopsStateTracker/Entities/TimeByState.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using AzureDevopsStateTracker.Extensions;
-using System;
-
-namespace AzureDevopsStateTracker.Entities
-{
- public class TimeByState : Entity
- {
- public string WorkItemId { get; private set; }
- public string State { get; private set; }
- public double TotalTime { get; private set; }
- public double TotalWorkedTime { get; private set; }
-
- public WorkItem WorkItem { get; private set; }
-
- private TimeByState() { }
-
- public TimeByState(string workItemId, string state, TimeSpan totalTime, TimeSpan totalWorkedTime)
- {
- WorkItemId = workItemId;
- State = state;
- TotalTime = totalTime.TotalSeconds;
- TotalWorkedTime = totalWorkedTime.TotalSeconds;
-
- Validate();
- }
-
- public void Validate()
- {
- if (WorkItemId.IsNullOrEmpty() || Convert.ToInt64(WorkItemId) <= 0)
- throw new Exception("WorkItemId is required");
-
- if (State.IsNullOrEmpty())
- throw new Exception("State is required");
- }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/Entities/WorkItem.cs b/AzureDevopsStateTracker/Entities/WorkItem.cs
deleted file mode 100644
index 64aa79c..0000000
--- a/AzureDevopsStateTracker/Entities/WorkItem.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-using AzureDevopsStateTracker.Extensions;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace AzureDevopsStateTracker.Entities
-{
- public class WorkItem : Entity
- {
- public string AreaPath { get; private set; }
- public string TeamProject { get; private set; }
- public string IterationPath { get; private set; }
- public string AssignedTo { get; private set; }
- public string Type { get; private set; }
- public string CreatedBy { get; private set; }
- public string Title { get; private set; }
- public string Tags { get; private set; }
- public string Effort { get; private set; }
- public string OriginalEstimate { get; private set; }
- public string StoryPoints { get; private set; }
- public string WorkItemParentId { get; private set; }
- public string Activity { get; private set; }
-
- private readonly List _workItemsChanges;
- public IReadOnlyCollection WorkItemsChanges => _workItemsChanges;
-
- private readonly List _timeByState;
- public IReadOnlyCollection TimeByStates => _timeByState;
- public string CurrentStatus => _workItemsChanges?.OrderBy(x => x.CreatedAt)?.LastOrDefault()?.NewState;
-
- private WorkItem()
- {
- _workItemsChanges = new List();
- _timeByState = new List();
- }
-
- public WorkItem(string workItemId) : base(workItemId)
- {
- _workItemsChanges = new List();
- _timeByState = new List();
- Validate();
- }
-
- public void Update(string title,
- string teamProject, string areaPath,
- string iterationPath, string type,
- string createdBy, string assignedTo,
- string tags,
- string workItemParentId,
- string effort,
- string storyPoint,
- string originalEstimate,
- string activity)
- {
- TeamProject = teamProject;
- AreaPath = areaPath;
- IterationPath = iterationPath;
- Type = type;
- Title = title;
- CreatedBy = createdBy;
- AssignedTo = assignedTo;
- Tags = tags;
- WorkItemParentId = workItemParentId;
- Effort = effort;
- StoryPoints = storyPoint;
- OriginalEstimate = originalEstimate;
- Activity = activity;
- }
-
- public void Validate()
- {
- if (Id.IsNullOrEmpty())
- throw new Exception("WorkItemId is required");
- }
-
- public void AddWorkItemChange(WorkItemChange workItemChange)
- {
- if (workItemChange == null)
- throw new Exception("WorkItemChange is null");
-
- _workItemsChanges.Add(workItemChange);
- }
-
- public void AddTimeByState(TimeByState timeByState)
- {
- if (timeByState == null)
- throw new Exception("TimeByState is null");
-
- _timeByState.Add(timeByState);
- }
-
- public void AddTimesByState(IEnumerable timesByState)
- {
- if (!timesByState.Any())
- return;
-
- foreach (var timeByState in timesByState)
- AddTimeByState(timeByState);
- }
-
- public void ClearTimesByState()
- {
- _timeByState.Clear();
- }
-
- public IEnumerable CalculateTotalTimeByState()
- {
- var timesByStateList = new List();
- if (!_workItemsChanges.Any())
- return timesByStateList;
-
- foreach (var workItemChange in _workItemsChanges.OrderBy(x => x.CreatedAt).GroupBy(x => x.OldState).Where(x => x.Key != null))
- {
- var totalTime = TimeSpan.Zero;
- var totalWorkedTime = TimeSpan.Zero;
- foreach (var data in workItemChange)
- {
- totalTime += data.CalculateTotalTime();
- totalWorkedTime += data.CalculateTotalWorkedTime();
- }
-
- timesByStateList.Add(new TimeByState(Id, workItemChange.Key, totalTime, totalWorkedTime));
- }
-
- return timesByStateList;
- }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/Entities/WorkItemChange.cs b/AzureDevopsStateTracker/Entities/WorkItemChange.cs
deleted file mode 100644
index b7baac5..0000000
--- a/AzureDevopsStateTracker/Entities/WorkItemChange.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using AzureDevopsStateTracker.Extensions;
-using System;
-
-namespace AzureDevopsStateTracker.Entities
-{
- public class WorkItemChange : Entity
- {
- public string WorkItemId { get; private set; }
- public DateTime NewDate { get; private set; }
- public DateTime? OldDate { get; private set; }
- public string NewState { get; private set; }
- public string OldState { get; private set; }
- public string ChangedBy { get; private set; }
- public WorkItem WorkItem { get; private set; }
-
- private WorkItemChange() { }
-
- public WorkItemChange(string workItemId, string changedBy, DateTime newDate, string newState, string oldState, DateTime? oldDate)
- {
- WorkItemId = workItemId;
- NewDate = newDate;
- OldDate = oldDate;
- NewState = newState;
- OldState = oldState;
- ChangedBy = changedBy;
-
- Validate();
- }
-
- public void Validate()
- {
- if (WorkItemId.IsNullOrEmpty() || Convert.ToInt64(WorkItemId) <= 0)
- throw new Exception("WorkItemId is required");
- }
-
- public TimeSpan CalculateTotalTime()
- {
- return OldDate == null ? TimeSpan.Zero : NewDate - OldDate.GetValueOrDefault();
- }
-
- public TimeSpan CalculateTotalWorkedTime()
- {
- if (OldDate.GetValueOrDefault() == DateTime.MinValue)
- return TimeSpan.Zero;
-
- TimeSpan hoursWorked = TimeSpan.Zero;
- for (var i = OldDate.GetValueOrDefault(); i <= NewDate; i = i.AddHours(1))
- {
- if (i.DayOfWeek != DayOfWeek.Saturday && i.DayOfWeek != DayOfWeek.Sunday)
- {
- if ((i.TimeOfDay.Hours >= 8 && i.TimeOfDay.Hours < 12) || (i.TimeOfDay.Hours >= 14 && i.TimeOfDay.Hours < 18))
- hoursWorked += (NewDate.TimeOfDay - i.TimeOfDay);
- }
- }
-
- return hoursWorked;
- }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/Extensions/HelperExtenions.cs b/AzureDevopsStateTracker/Extensions/HelperExtenions.cs
deleted file mode 100644
index 286b592..0000000
--- a/AzureDevopsStateTracker/Extensions/HelperExtenions.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-using System.Linq;
-
-namespace AzureDevopsStateTracker.Extensions
-{
- public static class HelperExtenions
- {
- public static bool IsNullOrEmpty(this string text)
- {
- return string.IsNullOrEmpty(text?.Trim());
- }
-
- public static string ExtractEmail(this string user)
- {
- if (user is null)
- return user;
-
- if (!user.Contains(" <") && !user.TrimEnd().Contains(">"))
- return user;
-
- return user.Split("<").LastOrDefault().Split(">").FirstOrDefault();
- }
-
- public static string ToTextTime(this TimeSpan timeSpan)
- {
- if (timeSpan.Days > 0)
- return $@"{timeSpan:%d} Dia(s) {timeSpan:%h} h e {timeSpan:%m} min e {timeSpan:%s} s";
-
- if (timeSpan.Hours > 0)
- return $@"{timeSpan:%h} h e {timeSpan:%m} min e {timeSpan:%s} s";
-
- if (timeSpan.Minutes > 0)
- return $@"{timeSpan:%m} min e {timeSpan:%s} s";
-
- if (timeSpan.Seconds > 0)
- return $@"{timeSpan:%s} s";
-
- return "-";
- }
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/Interfaces/IAzureDevopsStateTrackerService.cs b/AzureDevopsStateTracker/Interfaces/IAzureDevopsStateTrackerService.cs
deleted file mode 100644
index a0ef0f9..0000000
--- a/AzureDevopsStateTracker/Interfaces/IAzureDevopsStateTrackerService.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using AzureDevopsStateTracker.DTOs;
-using AzureDevopsStateTracker.DTOs.Create;
-using AzureDevopsStateTracker.DTOs.Update;
-
-namespace AzureDevopsStateTracker.Interfaces
-{
- public interface IAzureDevopsStateTrackerService
- {
- void Create(CreateWorkItemDTO createDto);
- void Update(UpdatedWorkItemDTO updateDto);
- WorkItemDTO GetByWorkItemId(string workItemId);
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/Interfaces/IWorkItemAdapter.cs b/AzureDevopsStateTracker/Interfaces/IWorkItemAdapter.cs
deleted file mode 100644
index 5fb5db8..0000000
--- a/AzureDevopsStateTracker/Interfaces/IWorkItemAdapter.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using AzureDevopsStateTracker.DTOs;
-using AzureDevopsStateTracker.Entities;
-using System.Collections.Generic;
-
-namespace AzureDevopsStateTracker.Interfaces
-{
- public interface IWorkItemAdapter
- {
- WorkItemDTO ToWorkItemDTO(WorkItem workItem);
- List ToWorkItemsDTO(List workItems);
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/Interfaces/Internals/IRepository.cs b/AzureDevopsStateTracker/Interfaces/Internals/IRepository.cs
deleted file mode 100644
index adbfb76..0000000
--- a/AzureDevopsStateTracker/Interfaces/Internals/IRepository.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using AzureDevopsStateTracker.Entities;
-using System;
-using System.Collections.Generic;
-
-namespace AzureDevopsStateTracker.Interfaces.Internals
-{
- public interface IRepository : IDisposable where TEntity : Entity
- {
- void Add(TEntity entity);
- void Add(IEnumerable entities);
- TEntity GetById(string id);
- bool Exist(string id);
- void Update(TEntity entity);
- void Update(IEnumerable entities);
- void Delete(TEntity entity);
- void SaveChanges();
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/Interfaces/Internals/IWorkItemRepository.cs b/AzureDevopsStateTracker/Interfaces/Internals/IWorkItemRepository.cs
deleted file mode 100644
index 82e93b9..0000000
--- a/AzureDevopsStateTracker/Interfaces/Internals/IWorkItemRepository.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using AzureDevopsStateTracker.Entities;
-using System.Collections.Generic;
-
-namespace AzureDevopsStateTracker.Interfaces.Internals
-{
- public interface IWorkItemRepository : IRepository
- {
- WorkItem GetByWorkItemId(string workItemId);
- IEnumerable ListByWorkItemId(IEnumerable workItemsId);
- IEnumerable ListByIterationPath(string iterationPath);
- void RemoveAllTimeByState(List timeByStates);
- }
-}
\ No newline at end of file
diff --git a/AzureDevopsStateTracker/Migrations/20210719163846_AzureDevopsStateTrackerInitial.Designer.cs b/AzureDevopsStateTracker/Migrations/20210719163846_AzureDevopsStateTrackerInitial.Designer.cs
deleted file mode 100644
index b7fa1cf..0000000
--- a/AzureDevopsStateTracker/Migrations/20210719163846_AzureDevopsStateTrackerInitial.Designer.cs
+++ /dev/null
@@ -1,154 +0,0 @@
-//
-using System;
-using AzureDevopsStateTracker.Data;
-using AzureDevopsStateTracker.Data.Context;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Infrastructure;
-using Microsoft.EntityFrameworkCore.Metadata;
-using Microsoft.EntityFrameworkCore.Migrations;
-using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
-
-namespace AzureDevopsStateTracker.Migrations
-{
- [DbContext(typeof(AzureDevopsStateTrackerContext))]
- [Migration("20210719163846_AzureDevopsStateTrackerInitial")]
- partial class AzureDevopsStateTrackerInitial
- {
- protected override void BuildTargetModel(ModelBuilder modelBuilder)
- {
-#pragma warning disable 612, 618
- modelBuilder
- .HasDefaultSchema(DataBaseConfig.SchemaName)
- .HasAnnotation("ProductVersion", "3.1.16")
- .HasAnnotation("Relational:MaxIdentifierLength", 128)
- .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.TimeByState", b =>
- {
- b.Property("Id")
- .HasColumnType("varchar(200)");
-
- b.Property("CreatedAt")
- .HasColumnType("datetime2");
-
- b.Property("State")
- .HasColumnType("varchar(200)");
-
- b.Property("TotalTime")
- .HasColumnType("float");
-
- b.Property("TotalWorkedTime")
- .HasColumnType("float");
-
- b.Property("WorkItemId")
- .HasColumnType("varchar(200)");
-
- b.HasKey("Id");
-
- b.HasIndex("WorkItemId");
-
- b.ToTable("TimeByStates");
- });
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.WorkItem", b =>
- {
- b.Property("Id")
- .HasColumnType("varchar(200)");
-
- b.Property("Activity")
- .HasColumnType("varchar(200)");
-
- b.Property("AreaPath")
- .HasColumnType("varchar(200)");
-
- b.Property("AssignedTo")
- .HasColumnType("varchar(200)");
-
- b.Property("CreatedAt")
- .HasColumnType("datetime2");
-
- b.Property("CreatedBy")
- .HasColumnType("varchar(200)");
-
- b.Property("Effort")
- .HasColumnType("varchar(200)");
-
- b.Property("IterationPath")
- .HasColumnType("varchar(200)");
-
- b.Property("OriginalEstimate")
- .HasColumnType("varchar(200)");
-
- b.Property("StoryPoints")
- .HasColumnType("varchar(200)");
-
- b.Property("Tags")
- .HasColumnType("varchar(200)");
-
- b.Property("TeamProject")
- .HasColumnType("varchar(200)");
-
- b.Property("Title")
- .HasColumnType("varchar(200)");
-
- b.Property("Type")
- .HasColumnType("varchar(200)");
-
- b.Property("WorkItemParentId")
- .HasColumnType("varchar(200)");
-
- b.HasKey("Id");
-
- b.ToTable("WorkItems");
- });
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.WorkItemChange", b =>
- {
- b.Property("Id")
- .HasColumnType("varchar(200)");
-
- b.Property("ChangedBy")
- .HasColumnType("varchar(200)");
-
- b.Property("CreatedAt")
- .HasColumnType("datetime2");
-
- b.Property("NewDate")
- .HasColumnType("datetime2");
-
- b.Property("NewState")
- .HasColumnType("varchar(200)");
-
- b.Property("OldDate")
- .HasColumnType("datetime2");
-
- b.Property("OldState")
- .HasColumnType("varchar(200)");
-
- b.Property("WorkItemId")
- .HasColumnType("varchar(200)");
-
- b.HasKey("Id");
-
- b.HasIndex("WorkItemId");
-
- b.ToTable("WorkItemsChange");
- });
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.TimeByState", b =>
- {
- b.HasOne("AzureDevopsStateTracker.Entities.WorkItem", "WorkItem")
- .WithMany("TimeByStates")
- .HasForeignKey("WorkItemId");
- });
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.WorkItemChange", b =>
- {
- b.HasOne("AzureDevopsStateTracker.Entities.WorkItem", "WorkItem")
- .WithMany("WorkItemsChanges")
- .HasForeignKey("WorkItemId");
- });
-#pragma warning restore 612, 618
- }
- }
-}
diff --git a/AzureDevopsStateTracker/Migrations/20210719163846_AzureDevopsStateTrackerInitial.cs b/AzureDevopsStateTracker/Migrations/20210719163846_AzureDevopsStateTrackerInitial.cs
deleted file mode 100644
index de24b1a..0000000
--- a/AzureDevopsStateTracker/Migrations/20210719163846_AzureDevopsStateTrackerInitial.cs
+++ /dev/null
@@ -1,118 +0,0 @@
-using System;
-using AzureDevopsStateTracker.Data;
-using Microsoft.EntityFrameworkCore.Migrations;
-
-namespace AzureDevopsStateTracker.Migrations
-{
- public partial class AzureDevopsStateTrackerInitial : Migration
- {
- protected override void Up(MigrationBuilder migrationBuilder)
- {
- migrationBuilder.EnsureSchema(
- name: DataBaseConfig.SchemaName);
-
- migrationBuilder.CreateTable(
- name: "WorkItems",
- schema: DataBaseConfig.SchemaName,
- columns: table => new
- {
- Id = table.Column(type: "varchar(200)", nullable: false),
- CreatedAt = table.Column(nullable: false),
- AreaPath = table.Column(type: "varchar(200)", nullable: true),
- TeamProject = table.Column(type: "varchar(200)", nullable: true),
- IterationPath = table.Column(type: "varchar(200)", nullable: true),
- AssignedTo = table.Column(type: "varchar(200)", nullable: true),
- Type = table.Column(type: "varchar(200)", nullable: true),
- CreatedBy = table.Column(type: "varchar(200)", nullable: true),
- Title = table.Column(type: "varchar(200)", nullable: true),
- Tags = table.Column(type: "varchar(200)", nullable: true),
- Effort = table.Column(type: "varchar(200)", nullable: true),
- OriginalEstimate = table.Column(type: "varchar(200)", nullable: true),
- StoryPoints = table.Column(type: "varchar(200)", nullable: true),
- WorkItemParentId = table.Column(type: "varchar(200)", nullable: true),
- Activity = table.Column(type: "varchar(200)", nullable: true)
- },
- constraints: table =>
- {
- table.PrimaryKey("PK_WorkItems", x => x.Id);
- });
-
- migrationBuilder.CreateTable(
- name: "TimeByStates",
- schema: DataBaseConfig.SchemaName,
- columns: table => new
- {
- Id = table.Column(type: "varchar(200)", nullable: false),
- CreatedAt = table.Column(nullable: false),
- WorkItemId = table.Column(type: "varchar(200)", nullable: true),
- State = table.Column(type: "varchar(200)", nullable: true),
- TotalTime = table.Column(nullable: false),
- TotalWorkedTime = table.Column(nullable: false)
- },
- constraints: table =>
- {
- table.PrimaryKey("PK_TimeByStates", x => x.Id);
- table.ForeignKey(
- name: "FK_TimeByStates_WorkItems_WorkItemId",
- column: x => x.WorkItemId,
- principalSchema: DataBaseConfig.SchemaName,
- principalTable: "WorkItems",
- principalColumn: "Id",
- onDelete: ReferentialAction.Restrict);
- });
-
- migrationBuilder.CreateTable(
- name: "WorkItemsChange",
- schema: DataBaseConfig.SchemaName,
- columns: table => new
- {
- Id = table.Column(type: "varchar(200)", nullable: false),
- CreatedAt = table.Column(nullable: false),
- WorkItemId = table.Column(type: "varchar(200)", nullable: true),
- NewDate = table.Column(nullable: false),
- OldDate = table.Column(nullable: true),
- NewState = table.Column(type: "varchar(200)", nullable: true),
- OldState = table.Column(type: "varchar(200)", nullable: true),
- ChangedBy = table.Column(type: "varchar(200)", nullable: true)
- },
- constraints: table =>
- {
- table.PrimaryKey("PK_WorkItemsChange", x => x.Id);
- table.ForeignKey(
- name: "FK_WorkItemsChange_WorkItems_WorkItemId",
- column: x => x.WorkItemId,
- principalSchema: DataBaseConfig.SchemaName,
- principalTable: "WorkItems",
- principalColumn: "Id",
- onDelete: ReferentialAction.Restrict);
- });
-
- migrationBuilder.CreateIndex(
- name: "IX_TimeByStates_WorkItemId",
- schema: DataBaseConfig.SchemaName,
- table: "TimeByStates",
- column: "WorkItemId");
-
- migrationBuilder.CreateIndex(
- name: "IX_WorkItemsChange_WorkItemId",
- schema: DataBaseConfig.SchemaName,
- table: "WorkItemsChange",
- column: "WorkItemId");
- }
-
- protected override void Down(MigrationBuilder migrationBuilder)
- {
- migrationBuilder.DropTable(
- name: "TimeByStates",
- schema: DataBaseConfig.SchemaName);
-
- migrationBuilder.DropTable(
- name: "WorkItemsChange",
- schema: DataBaseConfig.SchemaName);
-
- migrationBuilder.DropTable(
- name: "WorkItems",
- schema: DataBaseConfig.SchemaName);
- }
- }
-}
diff --git a/AzureDevopsStateTracker/Migrations/20210720105645_FunctionToTimeInitial.Designer.cs b/AzureDevopsStateTracker/Migrations/20210720105645_FunctionToTimeInitial.Designer.cs
deleted file mode 100644
index 9a8b8ed..0000000
--- a/AzureDevopsStateTracker/Migrations/20210720105645_FunctionToTimeInitial.Designer.cs
+++ /dev/null
@@ -1,154 +0,0 @@
-//
-using System;
-using AzureDevopsStateTracker.Data;
-using AzureDevopsStateTracker.Data.Context;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Infrastructure;
-using Microsoft.EntityFrameworkCore.Metadata;
-using Microsoft.EntityFrameworkCore.Migrations;
-using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
-
-namespace AzureDevopsStateTracker.Migrations
-{
- [DbContext(typeof(AzureDevopsStateTrackerContext))]
- [Migration("20210720105645_FunctionToTimeInitial")]
- partial class FunctionToTimeInitial
- {
- protected override void BuildTargetModel(ModelBuilder modelBuilder)
- {
-#pragma warning disable 612, 618
- modelBuilder
- .HasDefaultSchema(DataBaseConfig.SchemaName)
- .HasAnnotation("ProductVersion", "3.1.16")
- .HasAnnotation("Relational:MaxIdentifierLength", 128)
- .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.TimeByState", b =>
- {
- b.Property("Id")
- .HasColumnType("varchar(200)");
-
- b.Property("CreatedAt")
- .HasColumnType("datetime2");
-
- b.Property("State")
- .HasColumnType("varchar(200)");
-
- b.Property("TotalTime")
- .HasColumnType("float");
-
- b.Property("TotalWorkedTime")
- .HasColumnType("float");
-
- b.Property("WorkItemId")
- .HasColumnType("varchar(200)");
-
- b.HasKey("Id");
-
- b.HasIndex("WorkItemId");
-
- b.ToTable("TimeByStates");
- });
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.WorkItem", b =>
- {
- b.Property("Id")
- .HasColumnType("varchar(200)");
-
- b.Property("Activity")
- .HasColumnType("varchar(200)");
-
- b.Property("AreaPath")
- .HasColumnType("varchar(200)");
-
- b.Property("AssignedTo")
- .HasColumnType("varchar(200)");
-
- b.Property("CreatedAt")
- .HasColumnType("datetime2");
-
- b.Property("CreatedBy")
- .HasColumnType("varchar(200)");
-
- b.Property("Effort")
- .HasColumnType("varchar(200)");
-
- b.Property("IterationPath")
- .HasColumnType("varchar(200)");
-
- b.Property("OriginalEstimate")
- .HasColumnType("varchar(200)");
-
- b.Property("StoryPoints")
- .HasColumnType("varchar(200)");
-
- b.Property("Tags")
- .HasColumnType("varchar(200)");
-
- b.Property("TeamProject")
- .HasColumnType("varchar(200)");
-
- b.Property("Title")
- .HasColumnType("varchar(200)");
-
- b.Property("Type")
- .HasColumnType("varchar(200)");
-
- b.Property("WorkItemParentId")
- .HasColumnType("varchar(200)");
-
- b.HasKey("Id");
-
- b.ToTable("WorkItems");
- });
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.WorkItemChange", b =>
- {
- b.Property("Id")
- .HasColumnType("varchar(200)");
-
- b.Property("ChangedBy")
- .HasColumnType("varchar(200)");
-
- b.Property("CreatedAt")
- .HasColumnType("datetime2");
-
- b.Property("NewDate")
- .HasColumnType("datetime2");
-
- b.Property("NewState")
- .HasColumnType("varchar(200)");
-
- b.Property("OldDate")
- .HasColumnType("datetime2");
-
- b.Property("OldState")
- .HasColumnType("varchar(200)");
-
- b.Property("WorkItemId")
- .HasColumnType("varchar(200)");
-
- b.HasKey("Id");
-
- b.HasIndex("WorkItemId");
-
- b.ToTable("WorkItemsChange");
- });
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.TimeByState", b =>
- {
- b.HasOne("AzureDevopsStateTracker.Entities.WorkItem", "WorkItem")
- .WithMany("TimeByStates")
- .HasForeignKey("WorkItemId");
- });
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.WorkItemChange", b =>
- {
- b.HasOne("AzureDevopsStateTracker.Entities.WorkItem", "WorkItem")
- .WithMany("WorkItemsChanges")
- .HasForeignKey("WorkItemId");
- });
-#pragma warning restore 612, 618
- }
- }
-}
diff --git a/AzureDevopsStateTracker/Migrations/20210720105645_FunctionToTimeInitial.cs b/AzureDevopsStateTracker/Migrations/20210720105645_FunctionToTimeInitial.cs
deleted file mode 100644
index d7f9ca3..0000000
--- a/AzureDevopsStateTracker/Migrations/20210720105645_FunctionToTimeInitial.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using AzureDevopsStateTracker.Data;
-using Microsoft.EntityFrameworkCore.Migrations;
-
-namespace AzureDevopsStateTracker.Migrations
-{
- public partial class FunctionToTimeInitial : Migration
- {
- protected override void Up(MigrationBuilder migrationBuilder)
- {
- var rawFunction = @"CREATE OR ALTER FUNCTION ToTime (@seconds int)
- RETURNS varchar(50)
- AS BEGIN
- declare @seconds_in_a_day int = 86400;
- declare @seconds_in_an_hour int = 3600;
- declare @seconds_in_a_minute int = 60;
-
- declare @text_to_return varchar(50) = '';
- if(@seconds >= @seconds_in_a_day)
- begin
- declare @completed_days int = @seconds/@seconds_in_a_day;
- select @text_to_return = CONCAT(@text_to_return, @completed_days, ' day(s)')
- select @seconds = @seconds - (@seconds_in_a_day * @completed_days)
- end
-
- if(@seconds >= @seconds_in_an_hour)
- begin
- declare @completed_hours int = @seconds/@seconds_in_an_hour;
- select @text_to_return = CONCAT(@text_to_return, ' ', @completed_hours, ' hour(s)')
- select @seconds = @seconds - (@seconds_in_an_hour * @completed_hours)
- end
-
- if(@seconds >= @seconds_in_a_minute)
- begin
- declare @completed_minutes int = @seconds/@seconds_in_a_minute;
- select @text_to_return = CONCAT(@text_to_return, ' ', @completed_minutes, ' minute(s)')
- select @seconds = @seconds - (@seconds_in_a_minute * @completed_minutes)
- end
-
- return LTRIM(RTRIM(@text_to_return));
- END";
- migrationBuilder.Sql(rawFunction);
- }
-
- protected override void Down(MigrationBuilder migrationBuilder)
- {
- var dropFunction = @$"DROP FUNCTION IF EXISTS dbo.ToTime";
- migrationBuilder.Sql(dropFunction);
- }
- }
-}
diff --git a/AzureDevopsStateTracker/Migrations/AzureDevopsStateTrackerContextModelSnapshot.cs b/AzureDevopsStateTracker/Migrations/AzureDevopsStateTrackerContextModelSnapshot.cs
deleted file mode 100644
index 7baa9b1..0000000
--- a/AzureDevopsStateTracker/Migrations/AzureDevopsStateTrackerContextModelSnapshot.cs
+++ /dev/null
@@ -1,152 +0,0 @@
-//
-using System;
-using AzureDevopsStateTracker.Data;
-using AzureDevopsStateTracker.Data.Context;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Infrastructure;
-using Microsoft.EntityFrameworkCore.Metadata;
-using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
-
-namespace AzureDevopsStateTracker.Migrations
-{
- [DbContext(typeof(AzureDevopsStateTrackerContext))]
- partial class AzureDevopsStateTrackerContextModelSnapshot : ModelSnapshot
- {
- protected override void BuildModel(ModelBuilder modelBuilder)
- {
-#pragma warning disable 612, 618
- modelBuilder
- .HasDefaultSchema(DataBaseConfig.SchemaName)
- .HasAnnotation("ProductVersion", "3.1.16")
- .HasAnnotation("Relational:MaxIdentifierLength", 128)
- .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.TimeByState", b =>
- {
- b.Property("Id")
- .HasColumnType("varchar(200)");
-
- b.Property("CreatedAt")
- .HasColumnType("datetime2");
-
- b.Property("State")
- .HasColumnType("varchar(200)");
-
- b.Property("TotalTime")
- .HasColumnType("float");
-
- b.Property("TotalWorkedTime")
- .HasColumnType("float");
-
- b.Property("WorkItemId")
- .HasColumnType("varchar(200)");
-
- b.HasKey("Id");
-
- b.HasIndex("WorkItemId");
-
- b.ToTable("TimeByStates");
- });
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.WorkItem", b =>
- {
- b.Property("Id")
- .HasColumnType("varchar(200)");
-
- b.Property("Activity")
- .HasColumnType("varchar(200)");
-
- b.Property("AreaPath")
- .HasColumnType("varchar(200)");
-
- b.Property("AssignedTo")
- .HasColumnType("varchar(200)");
-
- b.Property("CreatedAt")
- .HasColumnType("datetime2");
-
- b.Property("CreatedBy")
- .HasColumnType("varchar(200)");
-
- b.Property("Effort")
- .HasColumnType("varchar(200)");
-
- b.Property("IterationPath")
- .HasColumnType("varchar(200)");
-
- b.Property("OriginalEstimate")
- .HasColumnType("varchar(200)");
-
- b.Property("StoryPoints")
- .HasColumnType("varchar(200)");
-
- b.Property("Tags")
- .HasColumnType("varchar(200)");
-
- b.Property("TeamProject")
- .HasColumnType("varchar(200)");
-
- b.Property("Title")
- .HasColumnType("varchar(200)");
-
- b.Property("Type")
- .HasColumnType("varchar(200)");
-
- b.Property("WorkItemParentId")
- .HasColumnType("varchar(200)");
-
- b.HasKey("Id");
-
- b.ToTable("WorkItems");
- });
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.WorkItemChange", b =>
- {
- b.Property("Id")
- .HasColumnType("varchar(200)");
-
- b.Property("ChangedBy")
- .HasColumnType("varchar(200)");
-
- b.Property("CreatedAt")
- .HasColumnType("datetime2");
-
- b.Property("NewDate")
- .HasColumnType("datetime2");
-
- b.Property("NewState")
- .HasColumnType("varchar(200)");
-
- b.Property("OldDate")
- .HasColumnType("datetime2");
-
- b.Property("OldState")
- .HasColumnType("varchar(200)");
-
- b.Property("WorkItemId")
- .HasColumnType("varchar(200)");
-
- b.HasKey("Id");
-
- b.HasIndex("WorkItemId");
-
- b.ToTable("WorkItemsChange");
- });
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.TimeByState", b =>
- {
- b.HasOne("AzureDevopsStateTracker.Entities.WorkItem", "WorkItem")
- .WithMany("TimeByStates")
- .HasForeignKey("WorkItemId");
- });
-
- modelBuilder.Entity("AzureDevopsStateTracker.Entities.WorkItemChange", b =>
- {
- b.HasOne("AzureDevopsStateTracker.Entities.WorkItem", "WorkItem")
- .WithMany("WorkItemsChanges")
- .HasForeignKey("WorkItemId");
- });
-#pragma warning restore 612, 618
- }
- }
-}
diff --git a/AzureDevopsStateTracker/Services/AzureDevopsStateTrackerService.cs b/AzureDevopsStateTracker/Services/AzureDevopsStateTrackerService.cs
deleted file mode 100644
index f9c1bfb..0000000
--- a/AzureDevopsStateTracker/Services/AzureDevopsStateTrackerService.cs
+++ /dev/null
@@ -1,129 +0,0 @@
-using AzureDevopsStateTracker.DTOs;
-using AzureDevopsStateTracker.DTOs.Create;
-using AzureDevopsStateTracker.DTOs.Update;
-using AzureDevopsStateTracker.Entities;
-using AzureDevopsStateTracker.Extensions;
-using AzureDevopsStateTracker.Interfaces;
-using AzureDevopsStateTracker.Interfaces.Internals;
-using System;
-using System.Linq;
-
-namespace AzureDevopsStateTracker.Services
-{
- public class AzureDevopsStateTrackerService : IAzureDevopsStateTrackerService
- {
- public readonly IWorkItemRepository _workItemRepository;
- public readonly IWorkItemAdapter _workItemAdapter;
-
- public AzureDevopsStateTrackerService(
- IWorkItemAdapter workItemAdapter, IWorkItemRepository workItemRepository)
- {
- _workItemAdapter = workItemAdapter;
- _workItemRepository = workItemRepository;
- }
-
- public void Create(CreateWorkItemDTO create)
- {
- var workItem = new WorkItem(create.Resource.Id);
-
- workItem.Update(create.Resource.Fields.Title,
- create.Resource.Fields.TeamProject,
- create.Resource.Fields.AreaPath,
- create.Resource.Fields.IterationPath,
- create.Resource.Fields.Type,
- create.Resource.Fields.CreatedBy.ExtractEmail(),
- create.Resource.Fields.AssignedTo.ExtractEmail(),
- create.Resource.Fields.Tags,
- create.Resource.Fields.Parent,
- create.Resource.Fields.Effort,
- create.Resource.Fields.StoryPoints,
- create.Resource.Fields.OriginalEstimate,
- create.Resource.Fields.Activity);
-
- AddWorkItemChange(workItem, create);
-
- _workItemRepository.Add(workItem);
- _workItemRepository.SaveChanges();
- }
-
- public void Update(UpdatedWorkItemDTO update)
- {
- var workItem = _workItemRepository.GetByWorkItemId(update.Resource.WorkItemId);
- if (workItem is null)
- return;
-
- workItem.Update(update.Resource.Revision.Fields.Title,
- update.Resource.Revision.Fields.TeamProject,
- update.Resource.Revision.Fields.AreaPath,
- update.Resource.Revision.Fields.IterationPath,
- update.Resource.Revision.Fields.Type,
- update.Resource.Revision.Fields.CreatedBy.ExtractEmail(),
- update.Resource.Revision.Fields.AssignedTo.ExtractEmail(),
- update.Resource.Revision.Fields.Tags,
- update.Resource.Revision.Fields.Parent,
- update.Resource.Revision.Fields.Effort,
- update.Resource.Revision.Fields.StoryPoints,
- update.Resource.Revision.Fields.OriginalEstimate,
- update.Resource.Revision.Fields.Activity);
-
- AddWorkItemChange(workItem, update);
-
- _workItemRepository.Update(workItem);
- _workItemRepository.SaveChanges();
- }
-
- public WorkItemDTO GetByWorkItemId(string workItemId)
- {
- var workItem = _workItemRepository.GetByWorkItemId(workItemId);
- if (workItem is null)
- return null;
-
- return _workItemAdapter.ToWorkItemDTO(workItem);
- }
-
- #region Support Methods
- public WorkItemChange ToWorkItemChange(string workItemId, string changedBy, DateTime newDate, string newState, string oldState = null, DateTime? oldDate = null)
- {
- return new WorkItemChange(workItemId, changedBy.ExtractEmail(), newDate, newState, oldState, oldDate);
- }
-
- public void AddWorkItemChange(WorkItem workItem, CreateWorkItemDTO create)
- {
- var workItemChange = ToWorkItemChange(workItem.Id,
- create.Resource.Fields.ChangedBy,
- create.Resource.Fields.CreatedDate,
- create.Resource.Fields.State);
-
- workItem.AddWorkItemChange(workItemChange);
- }
-
- public void AddWorkItemChange(WorkItem workItem, UpdatedWorkItemDTO update)
- {
- var changedBy = update.Resource.Revision.Fields.ChangedBy ?? update.Resource.Fields.ChangedBy.NewValue;
- var workItemChange = ToWorkItemChange(workItem.Id,
- changedBy,
- update.Resource.Fields.StateChangeDate.NewValue,
- update.Resource.Fields.State.NewValue,
- update.Resource.Fields.State.OldValue,
- update.Resource.Fields.StateChangeDate.OldValue);
-
- workItem.AddWorkItemChange(workItemChange);
-
- UpdateTimeByStates(workItem);
- }
-
- public void UpdateTimeByStates(WorkItem workItem)
- {
- RemoveTimeByStateFromDataBase(workItem);
-
- workItem.ClearTimesByState();
- workItem.AddTimesByState(workItem.CalculateTotalTimeByState());
- }
-
- public void RemoveTimeByStateFromDataBase(WorkItem workItem)
- {
- _workItemRepository.RemoveAllTimeByState(workItem.TimeByStates.ToList());
- }
- #endregion
- }
-}
\ No newline at end of file