using AsbCloudApp.Data; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudDb.Model; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository { #nullable enable public class LimitingParameterRepository : ILimitingParameterRepository { private readonly IAsbCloudDbContext context; public LimitingParameterRepository(IAsbCloudDbContext context) { this.context = context; } public async Task> GetLimitingParametersAsync(LimitingParameterRequest request, WellDto wellDto, CancellationToken token) { var timezoneOffset = wellDto.Timezone.Hours; var IdTelemetry = wellDto.IdTelemetry!.Value; return await GetLimitingParametersAsync(request, IdTelemetry, timezoneOffset, token); } public async Task> GetLimitingParametersAsync(LimitingParameterRequest request, int idTelemetry, double timezoneHours, CancellationToken token) { var timezoneSpan = TimeSpan.FromHours(timezoneHours); var query = BuildQuery(request, idTelemetry, timezoneHours); var data = (await query.ToListAsync(token)) .Select(x => new LimitingParameterDataDto { IdWell = request.IdWell, IdTelemetry = x.IdTelemetry, IdFeedRegulator = x.IdFeedRegulator, DateStart = DateTime.SpecifyKind(x.DateStart.UtcDateTime + timezoneSpan, DateTimeKind.Unspecified), DateEnd = DateTime.SpecifyKind(x.DateEnd.UtcDateTime + timezoneSpan, DateTimeKind.Unspecified), DepthStart = x.DepthStart, DepthEnd = x.DepthEnd }); return data; } private IQueryable BuildQuery(LimitingParameterRequest request, int idTelemetry, double timezoneHours) { var query = context.LimitingParameter .OrderBy(x => x.Id) .Where(x => x.IdTelemetry == idTelemetry) .AsNoTracking(); if (request.GtDate.HasValue) { var gtDate = request.GtDate.Value.ToUtcDateTimeOffset(timezoneHours); query = query.Where(x => x.DateEnd >= gtDate); } if (request.LtDate.HasValue) { var ltDate = request.LtDate.Value.ToUtcDateTimeOffset(timezoneHours); query = query.Where(x => x.DateStart <= ltDate); } if (request.GtDepth.HasValue) query = query.Where(x => x.DepthEnd >= request.GtDepth.Value); if (request.LtDepth.HasValue) query = query.Where(x => x.DepthStart <= request.LtDepth.Value); return query; } } #nullable disable }