From 8bc66a0d858851681ce3010ed9f72b0fe6ffde2b Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 7 Feb 2024 13:28:02 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B5=D0=B9?= =?UTF-8?q?=20=D0=B8=D0=B7=20t=5Fdata=5Fsaub=5Fstat=20=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=BA=D1=83=D1=81?= =?UTF-8?q?=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/DataSaubStatRepository.cs | 36 ++++++++++++++++--- .../Repository/DataSaubStatRepositoryTest.cs | 35 ++++++++++++++---- 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/DataSaubStatRepository.cs b/AsbCloudInfrastructure/Repository/DataSaubStatRepository.cs index 59064abf..92a228d8 100644 --- a/AsbCloudInfrastructure/Repository/DataSaubStatRepository.cs +++ b/AsbCloudInfrastructure/Repository/DataSaubStatRepository.cs @@ -1,5 +1,6 @@ using AsbCloudApp.Data; using AsbCloudApp.Repositories; +using AsbCloudApp.Services; using AsbCloudDb.Model; using Mapster; using Microsoft.EntityFrameworkCore; @@ -14,27 +15,54 @@ namespace AsbCloudInfrastructure.Repository public class DataSaubStatRepository : IDataSaubStatRepository { private readonly IAsbCloudDbContext db; + private readonly ITelemetryService telemetryService; - public DataSaubStatRepository(IAsbCloudDbContext dbContext) + public DataSaubStatRepository(IAsbCloudDbContext dbContext, ITelemetryService telemetryService) { db = dbContext; + this.telemetryService = telemetryService; + } public async Task> GetLastsAsync(int[] idTelemetries, CancellationToken token) { + var timeZoneOffsets = idTelemetries + .Distinct() + .ToDictionary(idTelemetry => idTelemetry, idTelemetry => TimeSpan.FromHours(telemetryService.GetTimezone(idTelemetry).Hours)); + var stats = await db.Set() .Where(s => idTelemetries.Contains(s.IdTelemetry)) - .GroupBy(s => s.IdTelemetry, (key, group) => group.OrderByDescending(el => el.DateEnd).First().Adapt()) + .GroupBy(s => s.IdTelemetry, (key, group) => group.OrderByDescending(el => el.DateEnd).First()) .ToArrayAsync(token); - return stats; + var result = stats.Select(s => ConvertToDto(s, timeZoneOffsets[s.IdTelemetry])); + + return result; } public async Task InsertRangeAsync(IEnumerable dataSaubStats, CancellationToken token) { - var entities = dataSaubStats.Select(data => data.Adapt()); + var entities = dataSaubStats.Select(data => ConvertToEntity(data)); db.Set().AddRange(entities); return await db.SaveChangesAsync(token); } + + private static DataSaubStatDto ConvertToDto(DataSaubStat entity, TimeSpan timeSpan) + { + var dto = entity.Adapt(); + dto.DateStart = dto.DateStart.ToOffset(timeSpan); + dto.DateEnd = dto.DateEnd.ToOffset(timeSpan); + + return dto; + } + + private static DataSaubStat ConvertToEntity(DataSaubStatDto dto) + { + var entity = dto.Adapt(); + entity.DateStart = dto.DateStart.ToUniversalTime(); + entity.DateEnd = dto.DateEnd.ToUniversalTime(); + + return entity; + } } } diff --git a/AsbCloudWebApi.IntegrationTests/Repository/DataSaubStatRepositoryTest.cs b/AsbCloudWebApi.IntegrationTests/Repository/DataSaubStatRepositoryTest.cs index b328e8b8..aa6102ba 100644 --- a/AsbCloudWebApi.IntegrationTests/Repository/DataSaubStatRepositoryTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Repository/DataSaubStatRepositoryTest.cs @@ -9,13 +9,15 @@ namespace AsbCloudWebApi.IntegrationTests.Repository { public class DataSaubStatRepositoryTest : BaseIntegrationTest { + private static readonly TimeSpan timeSpan = TimeSpan.FromHours(1); + private static readonly DataSaubStatDto[] statDtos = new DataSaubStatDto[2] { new DataSaubStatDto() { IdTelemetry = 1, - DateEnd = new DateTimeOffset(2024, 1, 1, 20, 25, 0, TimeSpan.Zero), - DateStart = new DateTimeOffset(2024, 1, 1, 20, 15, 0, TimeSpan.Zero), + DateEnd = new DateTimeOffset(2024, 1, 1, 20, 25, 0, timeSpan), + DateStart = new DateTimeOffset(2024, 1, 1, 20, 15, 0, timeSpan), AxialLoad = 10.0, AxialLoadLimitMax = 10.0, AxialLoadSp = 10.0, @@ -40,8 +42,8 @@ namespace AsbCloudWebApi.IntegrationTests.Repository new DataSaubStatDto() { IdTelemetry = 1, - DateEnd = new DateTimeOffset(2024, 2, 2, 20, 25, 0, TimeSpan.Zero), - DateStart = new DateTimeOffset(2024, 2, 2, 20, 15, 0, TimeSpan.Zero), + DateEnd = new DateTimeOffset(2024, 2, 2, 20, 25, 0, timeSpan), + DateStart = new DateTimeOffset(2024, 2, 2, 20, 15, 0, timeSpan), AxialLoad = 10.0, AxialLoadLimitMax = 10.0, AxialLoadSp = 10.0, @@ -87,7 +89,7 @@ namespace AsbCloudWebApi.IntegrationTests.Repository var dbSetSaubStat = dbContext.Set(); var dbSetCategories = dbContext.Set(); - var entities = statDtos.Select(stat => stat.Adapt()); + var entities = statDtos.Select(stat => ConvertToEntity(stat)); dbSetCategories.Add(category); dbSetSaubStat.AddRange(entities); @@ -113,6 +115,10 @@ namespace AsbCloudWebApi.IntegrationTests.Repository //act var dbSet = dbContext.Set(); dbSet.RemoveRange(dbSet); + + var dbSetCategories = dbContext.Set(); + dbSetCategories.Add(category); + dbContext.SaveChanges(); var result = await dataSaubStatRepository.InsertRangeAsync(statDtos, CancellationToken.None); @@ -120,7 +126,7 @@ namespace AsbCloudWebApi.IntegrationTests.Repository //assert Assert.Equal(statDtos.Length, result); - var statDtosFromDb = dbSet.Select(stat => stat.Adapt()).ToArray(); + var statDtosFromDb = dbSet.Select(stat => ConvertToDto(stat, timeSpan)).ToArray(); var excludedProps = new[] { nameof(DataSaubStat.Telemetry), @@ -136,7 +142,24 @@ namespace AsbCloudWebApi.IntegrationTests.Repository MatchHelper.Match(statDtoFromDb, statDto, excludedProps); } + } + private static DataSaubStat ConvertToEntity(DataSaubStatDto stat) + { + var entity = stat.Adapt(); + entity.DateStart = entity.DateStart.ToUniversalTime(); + entity.DateEnd = entity.DateEnd.ToUniversalTime(); + + return entity; + } + + private static DataSaubStatDto ConvertToDto(DataSaubStat stat, TimeSpan timeSpan) + { + var dto = stat.Adapt(); + dto.DateStart = dto.DateStart.ToOffset(timeSpan); + dto.DateEnd = dto.DateEnd.ToOffset(timeSpan); + + return dto; } } }