* Maintain FaKrosno api to handle Hangfire

* Added checking of missing EdiCo based on EdiCoTranslate and send email every 30 minutes
* Added Admin Scheduler view
This commit is contained in:
2025-02-14 08:46:56 +01:00
parent e7342abadd
commit c0fed5b3ec
38 changed files with 446 additions and 221 deletions

View File

@@ -0,0 +1,16 @@
using Hangfire.Storage;
namespace OrdersManagementDataModel.Dtos;
public class TaskSchedulerDto
{
public int Id { get; set; }
public string Name { get; set; }
public string Path { get; set; }
public string CronOptions { get; set; }
public DateTime CreateDate { get; set; }
public DateTime ActiveFrom { get; set; }
public DateTime? ActiveUntil { get; set; }
public JobData? JobDetails { get; set; }
}

View File

@@ -0,0 +1,13 @@
namespace OrdersManagementDataModel.Entities;
public class TaskScheduler
{
public int Id { get; set; }
public Guid RowPointer { get; set; }
public string Name { get; set; }
public string Path { get; set; }
public string CronOptions { get; set; }
public DateTime CreateDate { get; set; }
public DateTime ActiveFrom { get; set; }
public DateTime? ActiveUntil { get; set; }
}

View File

@@ -0,0 +1,12 @@
using AutoMapper;
using OrdersManagementDataModel.Dtos;
namespace OrdersManagementDataModel;
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<TaskScheduler, TaskSchedulerDto>().ReverseMap();
}
}

View File

@@ -0,0 +1,32 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="Hangfire.Core" Version="1.8.17" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.0" />
</ItemGroup>
<ItemGroup>
<None Update="appsettings_OrdersManagement.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,38 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using TaskScheduler = OrdersManagementDataModel.Entities.TaskScheduler;
namespace OrdersManagementDataModel;
public class OrdersManagementDbContext : DbContext
{
public OrdersManagementDbContext(DbContextOptions<OrdersManagementDbContext> options)
: base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var connectionString = configuration.GetConnectionString("OrdersManagementConnection");
optionsBuilder.UseSqlServer(connectionString, options => options.CommandTimeout(300));
}
public DbSet<TaskScheduler> TaskSchedulers { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<TaskScheduler>(entity =>
{
entity.HasKey(e => e.Id);
entity.ToTable("TaskScheduler");
entity.Property(e => e.RowPointer).HasDefaultValueSql("newid()");
entity.Property(e => e.CreateDate).HasDefaultValueSql("getdate()");
entity.Property(e => e.ActiveFrom).HasDefaultValueSql("getdate()");
entity.Property(e => e.ActiveUntil).IsRequired(false); });
}
}

View File

@@ -0,0 +1,19 @@
using Microsoft.EntityFrameworkCore;
using OrdersManagementDataModel.Dtos;
namespace OrdersManagementDataModel.Queries;
public static class OrdersManagementQueries
{
public static readonly Func<OrdersManagementDbContext, IEnumerable<TaskSchedulerDto>> GetSchedulers =
EF.CompileQuery((OrdersManagementDbContext context) => context.TaskSchedulers.Select(x => new TaskSchedulerDto
{
Id = x.Id,
Name = x.Name,
Path = x.Path,
CronOptions = x.CronOptions,
CreateDate = x.CreateDate,
ActiveFrom = x.ActiveFrom,
ActiveUntil = x.ActiveUntil
}));
}

View File

@@ -0,0 +1,12 @@
using OrdersManagementDataModel.Dtos;
namespace OrdersManagementDataModel.Services;
public interface ITaskSchedulerService
{
Task<IEnumerable<TaskSchedulerDto>> GetTaskSchedulers();
Task<TaskSchedulerDto?> GetTaskSchedulerByTaskName(string taskName);
Task<int> AddTaskScheduler(TaskSchedulerDto taskSchedulerDto);
Task<int> UpdateTaskScheduler(TaskSchedulerDto taskSchedulerDto);
Task<int> DeleteTaskScheduler(Guid id);
}

View File

@@ -0,0 +1,57 @@
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using OrdersManagementDataModel.Dtos;
using OrdersManagementDataModel.Queries;
using TaskScheduler = OrdersManagementDataModel.Entities.TaskScheduler;
namespace OrdersManagementDataModel.Services;
public class TaskSchedulerService(OrdersManagementDbContext context, IMapper mapper) : ITaskSchedulerService
{
public async Task<IEnumerable<TaskSchedulerDto>> GetTaskSchedulers()
{
List<TaskSchedulerDto> taskSchedulers =
(await Task.FromResult(OrdersManagementQueries.GetSchedulers(context))).ToList();
return taskSchedulers;
}
public async Task<TaskSchedulerDto?> GetTaskSchedulerById(Guid id)
{
TaskSchedulerDto? taskScheduler = await context.TaskSchedulers.Where(x => x.RowPointer == id)
.Select(x => mapper.Map<TaskSchedulerDto>(x)).FirstOrDefaultAsync();
return taskScheduler;
}
public async Task<TaskSchedulerDto?> GetTaskSchedulerByTaskName(string taskName)
{
TaskSchedulerDto? taskScheduler = await context.TaskSchedulers.Where(x => x.Name == taskName)
.Select(x => mapper.Map<TaskSchedulerDto>(x)).FirstOrDefaultAsync();
return taskScheduler;
}
public async Task<int> AddTaskScheduler(TaskSchedulerDto taskSchedulerDto)
{
TaskScheduler taskScheduler = mapper.Map<TaskScheduler>(taskSchedulerDto);
context.TaskSchedulers.Add(taskScheduler);
return await context.SaveChangesAsync();
}
public async Task<int> UpdateTaskScheduler(TaskSchedulerDto taskSchedulerDto)
{
TaskScheduler taskScheduler = mapper.Map<TaskScheduler>(taskSchedulerDto);
context.TaskSchedulers.Update(taskScheduler);
return await context.SaveChangesAsync();
}
public async Task<int> DeleteTaskScheduler(Guid id)
{
TaskScheduler? taskScheduler =
await context.TaskSchedulers.Where(x => x.RowPointer == id).FirstOrDefaultAsync() ?? null;
if (taskScheduler == null) return 0;
context.TaskSchedulers.Remove(taskScheduler);
return await context.SaveChangesAsync();
}
}

View File

@@ -0,0 +1,5 @@
{
"ConnectionStrings": {
"OrdersManagementConnection": "\"OrdersManagementConnection\": \"Server=192.168.0.7;Database=OrdersManagement;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true\";"
}
}