From 17c7392542070a6fdbfbab137c36199d883fef41 Mon Sep 17 00:00:00 2001
From: eugeniy_ivanov <ea.ivanov@digitaldrilling.ru>
Date: Tue, 25 Oct 2022 09:42:08 +0500
Subject: [PATCH] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?=
 =?UTF-8?q?=D0=B0=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C=20=D0=B2=D0=BE?=
 =?UTF-8?q?=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=B5=D0=BC=D0=B0=D1=8F=20?=
 =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=BC=20=D0=B8=D0=B7=D0=BC?=
 =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BD=20=D0=B0=D0=BB=D0=B3=D0=BE=D1=80=D0=B8?=
 =?UTF-8?q?=D1=82=D0=BC=20=D0=B2=D0=BD=D1=83=D1=82=D1=80=D0=B8=20=D0=BC?=
 =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../Requests/SubsystemOperationTimeRequest.cs |  2 +-
 .../ISubsystemOperationTimeService.cs         |  5 +--
 .../SubsystemOperationTimeService.cs          | 34 ++++++++-----------
 .../SubsystemOperationTimeController.cs       |  5 +--
 4 files changed, 21 insertions(+), 25 deletions(-)

diff --git a/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs b/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs
index 3a4c3e56..567e11cf 100644
--- a/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs
+++ b/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs
@@ -14,7 +14,7 @@ namespace AsbCloudApp.Requests
     public class SubsystemOperationTimeRequest: RequestBase
     {
         /// <summary>
-        /// идентификатор скважины, может не указыватся пользователем
+        /// идентификатор скважины
         /// </summary>
         [Required]
         public int IdWell { get; set; }
diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs
index e8332f36..62ade194 100644
--- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs
+++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs
@@ -1,4 +1,5 @@
-using AsbCloudApp.Data.Subsystems;
+using AsbCloudApp.Data;
+using AsbCloudApp.Data.Subsystems;
 using AsbCloudApp.Requests;
 using System;
 using System.Collections.Generic;
@@ -45,7 +46,7 @@ namespace AsbCloudApp.Services.Subsystems
         /// <param name="request"></param>
         /// <param name="token"></param>
         /// <returns></returns>
-        Task<IEnumerable<(DateTimeOffset, DateTimeOffset)>?> GetDateRangeOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token);       
+        Task<DatesRangeDto?> GetDateRangeOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token);       
     }
 #nullable disable
 }
diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs
index 09027db2..ae055acf 100644
--- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs
+++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs
@@ -186,28 +186,22 @@ namespace AsbCloudInfrastructure.Services.Subsystems
         }
 
         /// <inheritdoc/>
-        public async Task<IEnumerable<(DateTimeOffset, DateTimeOffset)>?> GetDateRangeOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token)
-        {
-            if (request.IdsSubsystems is null)
-                return null;
-             List<(DateTimeOffset dateFirst, DateTimeOffset dateLast)> result = new();
-             var dateRanges = await db.SubsystemOperationTimes
-                 .Where(o => request.IdsSubsystems.Contains(o.IdSubsystem))
-                 .GroupBy(o => o.IdSubsystem)
-                 .Select(g => new
-                 {
-                     DateFirst = g.Min(o => o.DateStart),
-                     DateLast = g.Max(o => o.DateEnd)
-                 })
-                 .ToListAsync(token);
-            if (dateRanges.Any() != true)            
-                return null;            
-            foreach (var dateRange in dateRanges)
+        public async Task<DatesRangeDto?> GetDateRangeOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token)
+        {            
+            var query = BuildQuery(request);
+            if (query is not null)
             {
-                var resultItem = (dateRange.DateFirst, dateRange.DateLast);
-                result.Add(resultItem);
+                var result = await query
+                .GroupBy(o => o.IdSubsystem)
+                 .Select(g => new DatesRangeDto
+                 {
+                     From = g.Min(o => o.DateStart).DateTime,
+                     To = g.Max(o => o.DateEnd).DateTime
+                 })
+                 .FirstOrDefaultAsync(token);
+                return result;
             }
-            return result;
+            return null;
         }
 
         private IQueryable<SubsystemOperationTime>? BuildQuery(SubsystemOperationTimeRequest request)
diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs
index 6dce80c6..7ac1c560 100644
--- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs
+++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs
@@ -10,6 +10,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using AsbCloudInfrastructure;
 using System;
+using AsbCloudApp.Data;
 
 namespace AsbCloudWebApi.Controllers.Subsystems
 {        
@@ -63,11 +64,11 @@ namespace AsbCloudWebApi.Controllers.Subsystems
         /// получить доступный диапазон дат наработки подсистемы. 
         /// </summary>
         [HttpGet("rangeDate")]
-        [ProducesResponseType(typeof(IEnumerable<(DateTimeOffset,DateTimeOffset)>), (int)System.Net.HttpStatusCode.OK)]
+        [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)]
         public async Task<IActionResult> GetDateRangeOperationTimeAsync([FromQuery] SubsystemOperationTimeRequest request, CancellationToken token = default)
         {
             if (!await UserHasAccesToWellAsync(request.IdWell, token))
-                return Forbid();
+                return Forbid();                
             var result = await subsystemOperationTimeService.GetDateRangeOperationTimeAsync(request, token);
             return Ok(result);
         }