2023-06-20 12:29:58 +10:00
using AutoMapper ;
using Microsoft.AspNetCore.Mvc ;
using Microsoft.EntityFrameworkCore ;
using PARR.API.Contracts.V1 ;
using PARR.API.Contracts.V1.Requests.Queries ;
using PARR.API.Contracts.V1.Responses ;
using PARR.API.Contracts.V1.Responses.Base ;
using PARR.API.Controllers.V1.Base ;
using PARR.API.Extensions ;
using PARR.API.Services.Interfaces ;
using PARR.DAL.DomainModels ;
2023-08-10 10:14:41 +10:00
using PARR.DAL.Models.V1 ;
2023-08-14 15:24:57 +10:00
using PARR.DAL.Services.Interfaces.V1 ;
2023-06-20 12:29:58 +10:00
namespace PARR.API.Controllers.V1
{
public class JobController : BaseApiController
{
private readonly IMapper mapper ;
2023-08-14 15:24:57 +10:00
private readonly V1_IJobService jobService ;
2023-06-20 12:29:58 +10:00
//private readonly ISchedulerService schedulerService;
private readonly IClientService clientService ;
2023-08-14 15:24:57 +10:00
private readonly V1_IHostService v1_hostService ;
private readonly V1_IJobJournalService jobJournalService ;
2023-06-20 12:29:58 +10:00
public JobController (
IMapper mapper ,
2023-08-14 15:24:57 +10:00
V1_IJobService jobService ,
2023-06-20 12:29:58 +10:00
IClientService clientService ,
2023-08-14 15:24:57 +10:00
V1_IHostService v1_hostService ,
V1_IJobJournalService jobJournalService
2023-06-20 12:29:58 +10:00
)
{
this . mapper = mapper ;
this . jobService = jobService ;
//this.schedulerService = schedulerService;
this . clientService = clientService ;
2023-08-14 15:24:57 +10:00
this . v1_hostService = v1_hostService ;
2023-06-20 16:54:38 +10:00
this . jobJournalService = jobJournalService ;
2023-06-20 12:29:58 +10:00
}
/// <summary>
2023-09-26 14:43:25 +10:00
/// (Н Е РАБОТАЕТ. АДАПТАЦИЯ ПОД НОВУЮ ВЕРСИЮ) Список всех jobо в постранично в соотвествии с фильтрами
2023-06-20 12:29:58 +10:00
/// </summary>
/// <param name="paginationQuery"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.Jobs.GetAll)]
public async Task < IActionResult > GetAll ( [ FromQuery ] PaginationQuery paginationQuery , [ FromQuery ] JobGetAllQuery filter )
{
var paginationFilter = mapper . Map < PaginationFilter > ( paginationQuery ) ;
2023-08-10 10:14:41 +10:00
IQueryable < V1_Job > query = jobService . Get ( ) . Include ( t = > t . JobMode ) . OrderBy ( s = > s . StartAt ) ;
2023-06-20 12:29:58 +10:00
if ( filter . IsEnabled . HasValue )
query = query . Where ( t = > t . IsEnabled = = filter . IsEnabled ) ;
if ( filter . StartDatePlanned . HasValue )
query = query . Where ( t = > t . StartAt . DateTime . Date < = filter . StartDatePlanned . Value . DateTime . Date ) ; ;
var jobs = await jobService . GetPage ( query , paginationFilter ) . ToListAsync ( ) ;
if ( ! jobs . Any ( ) )
return NoContent ( ) ;
var jobResponse = mapper . Map < List < JobGetAllResponse > > ( jobs ) ;
var paginationResponse = new PagedResponse < JobGetAllResponse > ( jobResponse , true ) . GetPaginatedProps ( paginationFilter , query ) ;
return Ok ( paginationResponse ) ;
}
2023-06-21 15:01:29 +10:00
/// <summary>
2023-09-26 14:43:25 +10:00
/// (Н Е РАБОТАЕТ. АДАПТАЦИЯ ПОД НОВУЮ ВЕРСИЮ) Список заданий на запуск по IP-адресу клиента исполнения
2023-06-21 15:01:29 +10:00
/// </summary>
/// <param name="requestQuery"></param>
/// <returns></returns>
2023-06-20 12:29:58 +10:00
[HttpGet(ApiRoutes.Jobs.GetByIp)]
public async Task < IActionResult > GetByClientIP ( [ FromQuery ] JobGetByIpQuery requestQuery )
{
var ip = requestQuery . Ip ? ? clientService . GetClientIp ( ) ? . ToString ( ) ;
if ( string . IsNullOrEmpty ( ip ) )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = "Client IP address is null." } } ) ) ;
2023-06-21 15:01:29 +10:00
var date = requestQuery . Date ? ? DateTimeOffset . UtcNow ;
2023-06-20 12:29:58 +10:00
// С одним IP может быть несколько информационных систем, соответственного а таблице храниться несколько записей хостов с одинаковым IP
2023-08-14 15:24:57 +10:00
var hosts = await v1_hostService . Get ( ) . Where ( h = > h . IP = = ip ) . ToListAsync ( ) ;
2023-06-21 11:09:40 +10:00
2023-08-10 10:14:41 +10:00
var hostJobsDict = new Dictionary < V1_Host , List < V1_Job > > ( ) ;
2023-06-20 12:29:58 +10:00
foreach ( var host in hosts )
{
var jobsHost = await jobService . Get ( )
. Include ( a = > a . Application ) . ThenInclude ( ah = > ah . ApplicationsInHosts ) /*.ThenInclude(h => h.Host)*/
2023-06-20 16:54:38 +10:00
. Include ( jm = > jm . JobMode )
2023-06-20 12:29:58 +10:00
. AsSplitQuery ( )
2023-06-21 15:01:29 +10:00
. Where ( j = > j . Application ! = null & & j . Application . ApplicationsInHosts . Any ( ah = > ah . HostId = = host . Id ) & & j . IsEnabled & & j . StartAt < = date )
2023-06-20 12:29:58 +10:00
. ToListAsync ( ) ;
2023-06-20 16:54:38 +10:00
2023-06-20 12:29:58 +10:00
if ( jobsHost . Any ( ) )
2023-06-20 16:54:38 +10:00
{
2023-06-20 12:29:58 +10:00
hostJobsDict . Add ( host , jobsHost ) ;
2023-06-20 16:54:38 +10:00
}
2023-06-20 12:29:58 +10:00
}
2023-08-10 10:14:41 +10:00
var jobsList = new List < V1_Job > ( ) ;
var jobsToResponse = new List < V1_Job > ( ) ;
2023-06-21 11:09:40 +10:00
2023-06-20 16:54:38 +10:00
foreach ( var hostAndJobs in hostJobsDict )
2023-06-20 12:29:58 +10:00
{
2023-06-21 11:09:40 +10:00
foreach ( var item in hostAndJobs . Value )
2023-06-20 12:29:58 +10:00
{
2023-06-20 16:54:38 +10:00
if ( ! jobsList . Contains ( item ) )
{
jobsList . Add ( item ) ;
var plannedJobs = await GetListJobsAsync ( item , hostAndJobs . Key , date ) ;
2023-06-21 11:09:40 +10:00
jobsToResponse . AddRange ( plannedJobs ) ;
}
}
}
2023-06-20 16:54:38 +10:00
2023-06-21 11:09:40 +10:00
jobsToResponse = jobsToResponse . OrderBy ( t = > t . StartAt ) . ToList ( ) ;
2023-06-20 16:54:38 +10:00
2023-06-21 11:09:40 +10:00
if ( ! jobsToResponse . Any ( ) )
return NoContent ( ) ;
2023-06-20 16:54:38 +10:00
2023-06-21 11:09:40 +10:00
if ( requestQuery . IsFullResponse = = true )
{
2023-06-21 15:01:29 +10:00
// возврат самого полного ответа
2023-06-21 11:09:40 +10:00
var jobResponse = mapper . Map < List < JobGetAllResponse > > ( jobsToResponse ) ;
return Ok ( new Response < List < JobGetAllResponse > > ( jobResponse , true ) ) ;
}
2023-06-20 16:54:38 +10:00
2023-06-21 15:01:29 +10:00
// возврат минимального ответа
2023-07-27 08:40:03 +10:00
return Ok ( mapper . Map < JobMinResponse > ( jobsToResponse ) ) ;
2023-07-26 10:09:25 +10:00
//try
//{
// return Ok(jobsToResponse.ToDictionary(t => t.ScriptName, d => d.StartAt));
//}
//catch (ArgumentException ex)
//{
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Н е могу создать json объект с одинаковым значением ключа (ScriptName). {ex.Message}" } }));
//}
2023-06-20 12:29:58 +10:00
}
2023-06-20 16:54:38 +10:00
2023-08-10 10:14:41 +10:00
private async Task < List < V1_Job > > GetListJobsAsync ( V1_Job job , V1_Host host , DateTimeOffset queryDate )
2023-06-20 16:54:38 +10:00
{
2023-08-10 10:14:41 +10:00
var jobs = new List < V1_Job > ( ) ;
2023-06-20 16:54:38 +10:00
2023-06-21 15:01:29 +10:00
#region description
2023-06-20 16:54:38 +10:00
// freaq > суток или нет?
//-----------
// меньше суток
//фрек=10 мин
// старт эт = 17:00 и != сегодня
//цикл 17:00 -10мин пока не начнется вчерашний день
//цикл 17:00 +10мин пока не начентся завтрашний день
// елси страт эт == сегодня
//цикл 17:00 +10мин пока не начентся завтрашний день
//-----------
// ------freaq больше суток--------
// журнал берем последнее событие (че там с о статусами? не надо пока), к нему пребавляем фрек, и смотрим == сегодня или нет, если сегодня то добавляем
// --------------
2023-06-21 15:01:29 +10:00
#endregion
2023-06-20 16:54:38 +10:00
var allDayMinutes = 1440 ;
if ( job . Frequency > = allDayMinutes )
{
//больше или = суток
var lastJournalItem = await jobJournalService . GetLastAsync ( job . Id , host . Id , queryDate ) ;
if ( lastJournalItem = = null )
{
// если в истории нет записей, то запускаем сегодня в стартЭт
// берем квери дэйт и ем задаем время из Джобс СтартЭт
var startDateTimeNext = new DateTimeOffset ( queryDate . Year , queryDate . Month , queryDate . Day , job . StartAt . Hour , job . StartAt . Minute , job . StartAt . Second , new TimeSpan ( 0 ) ) ;
2023-08-10 10:14:41 +10:00
var jobToAdded = mapper . Map < V1_Job > ( job ) ; //new Job { StartAt = startDateTimeNext };
2023-06-21 11:09:40 +10:00
jobToAdded . StartAt = startDateTimeNext ;
2023-06-20 16:54:38 +10:00
jobs . Add ( jobToAdded ) ;
}
else
{
var startDateNext = lastJournalItem . DateOper . DateTime . AddMinutes ( job . Frequency ) ;
if ( startDateNext . Date = = queryDate . DateTime . Date )
{
// если берем прошлую последнюю операцию из журнала, и к ней прибавить фрекунси, то время следующего старта сдвинется на время выполнения прошлого задания
// чтобы это избежать, берем квери дэйт и ем задаем время из Джобс СтартЭт
var startDateTimeNext = new DateTimeOffset ( queryDate . Year , queryDate . Month , queryDate . Day , job . StartAt . Hour , job . StartAt . Minute , job . StartAt . Second , new TimeSpan ( 0 ) ) ;
2023-08-10 10:14:41 +10:00
var jobToAdded = mapper . Map < V1_Job > ( job ) ;
2023-06-21 11:09:40 +10:00
jobToAdded . StartAt = startDateTimeNext ;
2023-06-20 16:54:38 +10:00
jobs . Add ( jobToAdded ) ;
}
}
}
else
{
//меньше суток
var startAtMinutes = ( job . StartAt - job . StartAt . StartOfDay ( ) ) . TotalMinutes ;
// если дата старта != queryDate
if ( job . StartAt . DateTime . Date ! = queryDate . DateTime . Date )
{
// отнимаем пока не наступили прошлые стуки
var min = startAtMinutes ;
2023-06-21 12:28:16 +10:00
while ( min > = 0 )
2023-06-20 16:54:38 +10:00
{
2023-06-21 11:09:40 +10:00
//var jobToAdded = new Job { StartAt = queryDate.StartOfDay().AddMinutes(min) };
2023-08-10 10:14:41 +10:00
var jobToAdded = mapper . Map < V1_Job > ( job ) ;
2023-06-21 11:09:40 +10:00
jobToAdded . StartAt = queryDate . StartOfDay ( ) . AddMinutes ( min ) ;
2023-06-20 16:54:38 +10:00
jobs . Add ( jobToAdded ) ;
min = min - job . Frequency ;
}
// прибавляем пока не наступят след сутки
2023-06-21 12:28:16 +10:00
min = startAtMinutes + job . Frequency ;
while ( min < allDayMinutes )
2023-06-20 16:54:38 +10:00
{
2023-06-21 11:09:40 +10:00
//var jobToAdded = new Job { StartAt = queryDate.StartOfDay().AddMinutes(min) };
2023-08-10 10:14:41 +10:00
var jobToAdded = mapper . Map < V1_Job > ( job ) ;
2023-06-21 11:09:40 +10:00
jobToAdded . StartAt = queryDate . StartOfDay ( ) . AddMinutes ( min ) ;
2023-06-20 16:54:38 +10:00
jobs . Add ( jobToAdded ) ;
min = min + job . Frequency ;
}
}
else
{
// = queryDate
// прибавляем пока не наступят след сутки
var min = startAtMinutes ;
2023-06-21 12:28:16 +10:00
while ( min < allDayMinutes )
2023-06-20 16:54:38 +10:00
{
2023-06-21 11:09:40 +10:00
//var jobToAdded = new Job { StartAt = queryDate.StartOfDay().AddMinutes(min) };
2023-08-10 10:14:41 +10:00
var jobToAdded = mapper . Map < V1_Job > ( job ) ;
2023-06-21 11:09:40 +10:00
jobToAdded . StartAt = queryDate . StartOfDay ( ) . AddMinutes ( min ) ;
2023-06-20 16:54:38 +10:00
jobs . Add ( jobToAdded ) ;
min = min + job . Frequency ;
}
}
}
return jobs ;
}
2023-06-20 12:29:58 +10:00
}
}