diff --git a/PARR.API/Contracts/V1/Requests/Queries/JobGetByIpQuery.cs b/PARR.API/Contracts/V1/Requests/Queries/JobGetByIpQuery.cs index 8907f045..d0b17884 100644 --- a/PARR.API/Contracts/V1/Requests/Queries/JobGetByIpQuery.cs +++ b/PARR.API/Contracts/V1/Requests/Queries/JobGetByIpQuery.cs @@ -2,14 +2,19 @@ { public class JobGetByIpQuery { + /// + /// По-умолчанию берётся IP-клиента или указанный вручную + /// public string? Ip { get; set; } + + /// + /// По-умолчанию расписание на сегодня или указанную дату + /// public DateTimeOffset? Date { get; set; } + /// + /// Вернуть полностью объект Job в json формате или вернуть краткий список со временем + /// public bool? IsFullResponse { get; set; } - - ///// - ///// Возвращает jobs которые ещё не выполнены - ///// - //public bool? IsPlanned { get; set; } } } diff --git a/PARR.API/Controllers/V1/JobController.cs b/PARR.API/Controllers/V1/JobController.cs index dc802abd..8b0c30ee 100644 --- a/PARR.API/Controllers/V1/JobController.cs +++ b/PARR.API/Controllers/V1/JobController.cs @@ -68,23 +68,20 @@ namespace PARR.API.Controllers.V1 return Ok(paginationResponse); } + + /// + /// Список заданий на запуск по IP-адресу клиента исполнения + /// + /// + /// [HttpGet(ApiRoutes.Jobs.GetByIp)] public async Task GetByClientIP([FromQuery] JobGetByIpQuery requestQuery) { - var d1 = DateTimeOffset.Now; - var d2 = DateTimeOffset.Now.Date; - - if (d1.Date == d2) { } - - - - - var ip = requestQuery.Ip ?? clientService.GetClientIp()?.ToString(); if (string.IsNullOrEmpty(ip)) return BadRequest(new Response(false, new List { new ErrorModel { Message = "Client IP address is null." } })); - var date = requestQuery.Date ?? DateTimeOffset.Now; + var date = requestQuery.Date ?? DateTimeOffset.UtcNow; // С одним IP может быть несколько информационных систем, соответственного а таблице храниться несколько записей хостов с одинаковым IP var hosts = await hostService.Get().Where(h => h.IP == ip).ToListAsync(); @@ -96,7 +93,7 @@ namespace PARR.API.Controllers.V1 .Include(a => a.Application).ThenInclude(ah => ah.ApplicationsInHosts)/*.ThenInclude(h => h.Host)*/ .Include(jm => jm.JobMode) .AsSplitQuery() - .Where(j => j.Application != null && j.Application.ApplicationsInHosts.Any(ah => ah.HostId == host.Id) && j.IsEnabled) + .Where(j => j.Application != null && j.Application.ApplicationsInHosts.Any(ah => ah.HostId == host.Id) && j.IsEnabled && j.StartAt <= date) .ToListAsync(); if (jobsHost.Any()) @@ -129,26 +126,21 @@ namespace PARR.API.Controllers.V1 if (requestQuery.IsFullResponse == true) { + // возврат самого полного ответа var jobResponse = mapper.Map>(jobsToResponse); return Ok(new Response>(jobResponse, true)); } - //var responseDict = new Dictionary(); - //foreach () - //{ - - //} - - - - // var jobListForResponse = new - - - //var dic = new Dictionary(); - //dic.Add("sss1", "222"); - //dic.Add("sss2", "333"); - return Ok(); + // возврат минимального ответа + try + { + return Ok(jobsToResponse.ToDictionary(t => t.ScriptName, d => d.StartAt)); + } + catch (ArgumentException ex) + { + return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Не могу создать json объект с одинаковым значением ключа (ScriptName). {ex.Message}" } })); + } } @@ -156,7 +148,7 @@ namespace PARR.API.Controllers.V1 { var jobs = new List(); - + #region description // freaq > суток или нет? //----------- @@ -175,7 +167,7 @@ namespace PARR.API.Controllers.V1 // ------freaq больше суток-------- // журнал берем последнее событие (че там со статусами? не надо пока), к нему пребавляем фрек, и смотрим == сегодня или нет, если сегодня то добавляем // -------------- - + #endregion var allDayMinutes = 1440; if (job.Frequency >= allDayMinutes) @@ -188,7 +180,6 @@ namespace PARR.API.Controllers.V1 // если в истории нет записей, то запускаем сегодня в стартЭт // берем квери дэйт и ем задаем время из Джобс СтартЭт var startDateTimeNext = new DateTimeOffset(queryDate.Year, queryDate.Month, queryDate.Day, job.StartAt.Hour, job.StartAt.Minute, job.StartAt.Second, new TimeSpan(0)); - //todo: check var jobToAdded = mapper.Map(job);//new Job { StartAt = startDateTimeNext }; jobToAdded.StartAt = startDateTimeNext; @@ -202,7 +193,6 @@ namespace PARR.API.Controllers.V1 // если берем прошлую последнюю операцию из журнала, и к ней прибавить фрекунси, то время следующего старта сдвинется на время выполнения прошлого задания // чтобы это избежать, берем квери дэйт и ем задаем время из Джобс СтартЭт var startDateTimeNext = new DateTimeOffset(queryDate.Year, queryDate.Month, queryDate.Day, job.StartAt.Hour, job.StartAt.Minute, job.StartAt.Second, new TimeSpan(0)); - //todo: check var jobToAdded = mapper.Map(job); jobToAdded.StartAt = startDateTimeNext; jobs.Add(jobToAdded); @@ -222,7 +212,6 @@ namespace PARR.API.Controllers.V1 while (min >= 0) { //var jobToAdded = new Job { StartAt = queryDate.StartOfDay().AddMinutes(min) }; - //todo: check var jobToAdded = mapper.Map(job); jobToAdded.StartAt = queryDate.StartOfDay().AddMinutes(min); jobs.Add(jobToAdded); @@ -233,7 +222,6 @@ namespace PARR.API.Controllers.V1 min = startAtMinutes + job.Frequency; while (min < allDayMinutes) { - //TODO: check //var jobToAdded = new Job { StartAt = queryDate.StartOfDay().AddMinutes(min) }; var jobToAdded = mapper.Map(job); jobToAdded.StartAt = queryDate.StartOfDay().AddMinutes(min); @@ -248,7 +236,6 @@ namespace PARR.API.Controllers.V1 var min = startAtMinutes; while (min < allDayMinutes) { - //TODO //var jobToAdded = new Job { StartAt = queryDate.StartOfDay().AddMinutes(min) }; var jobToAdded = mapper.Map(job); jobToAdded.StartAt = queryDate.StartOfDay().AddMinutes(min); @@ -261,70 +248,5 @@ namespace PARR.API.Controllers.V1 return jobs; } - - //[HttpGet(ApiRoutes.Jobs.GetByIp)] - //public async Task GetByClientIP([FromQuery] JobGetByIpQuery requestQuery) - //{ - // var ip = requestQuery.Ip ?? clientService.GetClientIp()?.ToString(); - // if (string.IsNullOrEmpty(ip)) - // return BadRequest(new Response(false, new List { new ErrorModel { Message = "Client IP address is null." } })); - - // var date = requestQuery.Date ?? DateTimeOffset.Now; - - // // С одним IP может быть несколько информационных систем, соответственного а таблице храниться несколько записей хостов с одинаковым IP - // var hosts = await hostService.Get().Where(h => h.IP == ip).ToListAsync(); - // var hostJobsDict = new Dictionary>(); - // foreach (var host in hosts) - // { - // var jobsHostQuery = jobService.Get() - // .Include(a => a.Application).ThenInclude(ah => ah.ApplicationsInHosts)/*.ThenInclude(h => h.Host)*/ - // .Include(jm => jm.JobMode) - // .AsSplitQuery() - // .Where(j => j.Application != null && j.Application.ApplicationsInHosts.Any(ah => ah.HostId == host.Id)); - - // if (requestQuery.IsPlanned == true) - // { - // // ототбражем только включенные - // jobsHostQuery = jobsHostQuery.Where(t => t.IsEnabled == true); - // } - - // var jobsHost = await jobsHostQuery.ToListAsync(); - - - // if (requestQuery.IsPlanned == true) - // { - // // смотрим в истории, если задание уже было запущено, то его не отображаем - // foreach (var jobItem in jobsHost) - // { - // var journalItem = await jobJournalService.GetLastAsync(jobItem.Id, host.Id, date); - // if (JobStatusEnum.started) { } - // } - // } - - // if (jobsHost.Any()) - // { - // //Проверяем Job вк - // hostJobsDict.Add(host, jobsHost); - // } - // } - // //hostJobsDict.Values.Distinct(); - - // var jobsJoined = new List(); - // foreach (var job in hostJobsDict.Values) - // { - // job.ForEach(item => - // { - // jobsJoined.Add(item); - // }); - // } - - // if (!jobsJoined.Any()) - // return NoContent(); - - // var jobResponse = mapper.Map>(jobsJoined.Distinct()); - - // return Ok(new Response>(jobResponse, true, new List(), $"{ip},{date}")); - //} - } } diff --git a/PARR.API/Installers/SwaggerInstaller.cs b/PARR.API/Installers/SwaggerInstaller.cs index fc66b288..993b0c55 100644 --- a/PARR.API/Installers/SwaggerInstaller.cs +++ b/PARR.API/Installers/SwaggerInstaller.cs @@ -37,11 +37,12 @@ namespace PARR.API.Installers public static void InstallSwagger(this WebApplication app) { // Configure the HTTP request pipeline. - if (app.Environment.IsDevelopment()) - { + //todo: оставили swagger для прода + //if (app.Environment.IsDevelopment()) + //{ app.UseSwagger(); app.UseSwaggerUI(); - } + //} } } } diff --git a/PARR.DAL/Extensions/GeneralExtesions.cs b/PARR.DAL/Extensions/GeneralExtesions.cs index f30e308e..842edc73 100644 --- a/PARR.DAL/Extensions/GeneralExtesions.cs +++ b/PARR.DAL/Extensions/GeneralExtesions.cs @@ -18,7 +18,7 @@ namespace PARR.DAL.Extensions try { - return JsonSerializer.Serialize(value, new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.All, UnicodeRanges.Cyrillic) }); ; + return JsonSerializer.Serialize(value, new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.All, UnicodeRanges.Cyrillic) }); } catch// (Exception ex) {