diff --git a/AsbCloudApp/Data/FluidDataDto.cs b/AsbCloudApp/Data/FluidDataDto.cs deleted file mode 100644 index 6f1d41c2..00000000 --- a/AsbCloudApp/Data/FluidDataDto.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; - -namespace AsbCloudApp.Data -{ - public class FluidDataDto - { - public int Key { get; set; } - public DateTime LastUpdate { get; set; } = DateTime.Now; - public string Name { get; set; } - public double Temperature { get; set; } - public double Density { get; set; } - public double ConditionalViscosity { get; set; } - public double R300 { get; set; } - public double R600 { get; set; } - public double R3r6 { get; set; } - public double DnsDpa { get; set; } - public double PlasticViscocity { get; set; } - public double SnsDpa { get; set; } - public double R3r649С { get; set; } - public double Dns49Cdpa { get; set; } - public double PlasticViscocity49c { get; set; } - public double Sns49Cdpa { get; set; } - public double Mbt { get; set; } - public double Sand { get; set; } - public double Filtering { get; set; } - public double Crust { get; set; } - public double Ktk { get; set; } - public double Ph { get; set; } - public double Hardness { get; set; } - public double Chlorides { get; set; } - public double Pf { get; set; } - public double Mf { get; set; } - public double Pm { get; set; } - public double FluidSolidPhase { get; set; } - public double Grease { get; set; } - public double CalciumCarbonate { get; set; } - } -} diff --git a/AsbCloudApp/Data/LastDataDto.cs b/AsbCloudApp/Data/LastDataDto.cs new file mode 100644 index 00000000..ae83c4b2 --- /dev/null +++ b/AsbCloudApp/Data/LastDataDto.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace AsbCloudApp.Data +{ + public class LastDataDto + { + public int Id { get; set; } + + public int IdWell { get; set; } + + public int IdCategory { get; set; } + + public string CategoryName { get; set; } + + public DateTime DateInsert { get; set; } + + public DateTime DateModify { get; set; } + + public Dictionary Data { get; set; } + } +} diff --git a/AsbCloudApp/Data/MudDiagramDataDto.cs b/AsbCloudApp/Data/MudDiagramDataDto.cs deleted file mode 100644 index da29d257..00000000 --- a/AsbCloudApp/Data/MudDiagramDataDto.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; - -namespace AsbCloudApp.Data -{ - public class MudDiagramDataDto - { - public int Key { get; set; } - public DateTime LastUpdate { get; set; } = DateTime.Now; - public double ProbeNumber { get; set; } - public double ProbeExtractionDepth { get; set; } - public double Sandstone { get; set; } - public double Siltstone { get; set; } - public double Argillit { get; set; } - public double BrokenArgillit { get; set; } - public double Coal { get; set; } - public double Sand { get; set; } - public double Clay { get; set; } - public double Camstone { get; set; } - public double Cement { get; set; } - public string Summary { get; set; } - public double DrillingMud { get; set; } - public double Sludge { get; set; } - public double MaxSum { get; set; } - public double Methane { get; set; } - public double Ethane { get; set; } - public double Propane { get; set; } - public double Butane { get; set; } - public double Pentane { get; set; } - public double MechanicalSpeed { get; set; } - public string PreliminaryConclusion { get; set; } - } -} diff --git a/AsbCloudApp/Data/NnbDataDto.cs b/AsbCloudApp/Data/NnbDataDto.cs deleted file mode 100644 index 4871a50f..00000000 --- a/AsbCloudApp/Data/NnbDataDto.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace AsbCloudApp.Data -{ - public class NnbDataDto - { - public int Key { get; set; } - public DateTime LastUpdate { get; set; } = DateTime.Now; - public double Depth { get; set; } - public double ZenithAngle { get; set; } - public double MagneticAzimuth { get; set; } - public double TrueAzimuth { get; set; } - public double ConditionalViscosity { get; set; } - public double DirectAzimuth { get; set; } - public double VerticalDepth { get; set; } - public double AbsoluteMark { get; set; } - public double LocalNorthOffset { get; set; } - public double LocalEastOffset { get; set; } - public double OutFallOffset { get; set; } - public double OffsetAzimuth { get; set; } - public double AreaIntensity { get; set; } - public double OffsetStopAngle { get; set; } - public double ZenithIntensity { get; set; } - public double Comment { get; set; } - public double DepthPlanFactDifference { get; set; } - public double DistancePlanFactDifference { get; set; } - } -} diff --git a/AsbCloudApp/Services/ILastDataService.cs b/AsbCloudApp/Services/ILastDataService.cs index 500fb693..d9011307 100644 --- a/AsbCloudApp/Services/ILastDataService.cs +++ b/AsbCloudApp/Services/ILastDataService.cs @@ -1,13 +1,18 @@ -using System.Threading; +using AsbCloudApp.Data; +using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; namespace AsbCloudApp.Services { - public interface ILastDataService + public interface ILastDataService { - Task GetAsync(int idWell, int idCategory, - CancellationToken token); - Task UpsertAsync(int idWell, int idCategory, Tdto value, - CancellationToken token); + Task> GetCategoriesAsync(CancellationToken token); + Task> GetHisoryAsync(int idWell, int idCategory, CancellationToken token); + Task> GetAllLastAsync(int idWell, CancellationToken token); + Task InsertAsync(int idWell, LastDataDto data, CancellationToken token); + Task UpdateAsync(int idWell, LastDataDto data, CancellationToken token); + Task MarkAsDeleteAsync(int idWell, int idData, CancellationToken token); + Task DeleteAsync(int idWell, int idData, CancellationToken token); } } diff --git a/AsbCloudDb/Model/FluidData.cs b/AsbCloudDb/Model/FluidData.cs deleted file mode 100644 index effa8681..00000000 --- a/AsbCloudDb/Model/FluidData.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; - -namespace AsbCloudDb.Model -{ - public class FluidData - { - public int Key { get; set; } - public DateTime LastUpdate { get; set; } = DateTime.Now; - public string Name { get; set; } - public double Temperature { get; set; } - public double Density { get; set; } - public double ConditionalViscosity { get; set; } - public double R300 { get; set; } - public double R600 { get; set; } - public double R3r6 { get; set; } - public double DnsDpa { get; set; } - public double PlasticViscocity { get; set; } - public double SnsDpa { get; set; } - public double R3r649С { get; set; } - public double Dns49Cdpa { get; set; } - public double PlasticViscocity49c { get; set; } - public double Sns49Cdpa { get; set; } - public double Mbt { get; set; } - public double Sand { get; set; } - public double Filtering { get; set; } - public double Crust { get; set; } - public double Ktk { get; set; } - public double Ph { get; set; } - public double Hardness { get; set; } - public double Chlorides { get; set; } - public double Pf { get; set; } - public double Mf { get; set; } - public double Pm { get; set; } - public double FluidSolidPhase { get; set; } - public double Grease { get; set; } - public double CalciumCarbonate { get; set; } - } -} diff --git a/AsbCloudDb/Model/LastData.cs b/AsbCloudDb/Model/LastData.cs index b045df89..1c8eb032 100644 --- a/AsbCloudDb/Model/LastData.cs +++ b/AsbCloudDb/Model/LastData.cs @@ -1,4 +1,6 @@ using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Text.Json.Serialization; @@ -18,8 +20,14 @@ namespace AsbCloudDb.Model [Column("id_category"), Comment("id категории")] public int IdCategory { get; set; } + [Column("date_insert"), Comment("время добавления")] + public DateTime DateInsert { get; set; } + + [Column("date_modify"), Comment("время изменения")] + public DateTime DateModify { get; set; } + [Column("data", TypeName = "jsonb"), Comment("Данные таблицы последних данных")] - public object Data { get; set; } + public Dictionary Data { get; set; } [JsonIgnore] [ForeignKey(nameof(IdWell))] @@ -27,6 +35,6 @@ namespace AsbCloudDb.Model [JsonIgnore] [ForeignKey(nameof(IdCategory))] - public virtual LastDataCategory LastDataCategory { get; set; } + public virtual LastDataCategory Category { get; set; } } } diff --git a/AsbCloudDb/Model/MudDiagramData.cs b/AsbCloudDb/Model/MudDiagramData.cs deleted file mode 100644 index 4eeb4b79..00000000 --- a/AsbCloudDb/Model/MudDiagramData.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; - -namespace AsbCloudDb.Model -{ - public class MudDiagramData - { - public int Key { get; set; } - public DateTime LastUpdate { get; set; } = DateTime.Now; - public double ProbeNumber { get; set; } - public double ProbeExtractionDepth { get; set; } - public double Sandstone { get; set; } - public double Siltstone { get; set; } - public double Argillit { get; set; } - public double BrokenArgillit { get; set; } - public double Coal { get; set; } - public double Sand { get; set; } - public double Clay { get; set; } - public double Camstone { get; set; } - public double Cement { get; set; } - public string Summary { get; set; } - public double DrillingMud { get; set; } - public double Sludge { get; set; } - public double MaxSum { get; set; } - public double Methane { get; set; } - public double Ethane { get; set; } - public double Propane { get; set; } - public double Butane { get; set; } - public double Pentane { get; set; } - public double MechanicalSpeed { get; set; } - public string PreliminaryConclusion { get; set; } - } -} diff --git a/AsbCloudDb/Model/NnbData.cs b/AsbCloudDb/Model/NnbData.cs deleted file mode 100644 index 6cfbef7b..00000000 --- a/AsbCloudDb/Model/NnbData.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace AsbCloudDb.Model -{ - public class NnbData - { - public int Key { get; set; } - public DateTime LastUpdate { get; set; } = DateTime.Now; - public double Depth { get; set; } - public double ZenithAngle { get; set; } - public double MagneticAzimuth { get; set; } - public double TrueAzimuth { get; set; } - public double ConditionalViscosity { get; set; } - public double DirectAzimuth { get; set; } - public double VerticalDepth { get; set; } - public double AbsoluteMark { get; set; } - public double LocalNorthOffset { get; set; } - public double LocalEastOffset { get; set; } - public double OutFallOffset { get; set; } - public double OffsetAzimuth { get; set; } - public double AreaIntensity { get; set; } - public double OffsetStopAngle { get; set; } - public double ZenithIntensity { get; set; } - public double Comment { get; set; } - public double DepthPlanFactDifference { get; set; } - public double DistancePlanFactDifference { get; set; } - } -} diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 15f12de7..094b6881 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -38,10 +38,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - - services.AddTransient, LastDataService>(); - services.AddTransient, LastDataService>(); - services.AddTransient, LastDataService>(); + services.AddTransient(); return services; } diff --git a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs index 905ff2c1..5dd7a935 100644 --- a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs +++ b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs @@ -148,6 +148,9 @@ namespace AsbCloudInfrastructure.Services.Cache return result; } + public Task> WhereAsync(CancellationToken token = default) + => WhereAsync(default, RefreshMode.IfResultEmpty, token); + public Task> WhereAsync(Func predicate, CancellationToken token = default) => WhereAsync(predicate, RefreshMode.IfResultEmpty, token); diff --git a/AsbCloudInfrastructure/Services/LastDataService.cs b/AsbCloudInfrastructure/Services/LastDataService.cs index bb8f86f0..f8f36df2 100644 --- a/AsbCloudInfrastructure/Services/LastDataService.cs +++ b/AsbCloudInfrastructure/Services/LastDataService.cs @@ -1,64 +1,69 @@ -using AsbCloudApp.Services; +using AsbCloudApp.Data; +using AsbCloudApp.Services; using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services.Cache; using Mapster; using Microsoft.EntityFrameworkCore; -using System.Text.Json; +using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services { - public class LastDataService : ILastDataService where Tdto : new() + public class LastDataService : ILastDataService { private readonly IAsbCloudDbContext db; + private readonly CacheTable cacheCategories; - public LastDataService(IAsbCloudDbContext db) + public LastDataService(IAsbCloudDbContext db, Cache.CacheDb cacheDb) { this.db = db; + cacheCategories = cacheDb.GetCachedTable((DbContext)db); } - public async Task GetAsync(int idWell, int idCategory, - CancellationToken token = default) + public async Task> GetCategoriesAsync(CancellationToken token) { - var entity = await db.LastData.AsNoTracking().FirstOrDefaultAsync(e => - e.IdWell == idWell && e.IdCategory == idCategory, token) - .ConfigureAwait(false); - - if (entity is null) - return new Tdto(); - - var dto = JsonSerializer.Deserialize(entity.Data.ToString()); + var entities = await cacheCategories.WhereAsync(token).ConfigureAwait(false); + var dto = entities.ToDictionary(e=>e.Id, e=>e.Name); return dto; } - public async Task UpsertAsync(int idWell, int idCategory, - Tdto value, CancellationToken token = default) + public async Task> GetAllLastAsync(int idWell, CancellationToken token) { - var model = value.Adapt(); - - var entity = await db.LastData.AsNoTracking() - .FirstOrDefaultAsync(ld => ld.IdWell == idWell && - ld.IdCategory == idCategory, token) + var entities = await db.LastData + .Include(e => e.Category) + .Where(e => e.IdWell == idWell) + .AsNoTracking() + .ToListAsync(token) .ConfigureAwait(false); + var dtos = entities.Adapt((d, s) => d.CategoryName = s.Category.Name); + return dtos; + } - if (entity is not null) - { - entity.Data = model; - db.LastData.Update(entity); - } - else - { - var newLastData = new LastData - { - IdWell = idWell, - IdCategory = idCategory, - Data = model - }; - db.LastData.Add(newLastData); - } + public Task> GetHisoryAsync(int idWell, int idCategory, CancellationToken token) + { + throw new System.NotImplementedException(); + } - return await db.SaveChangesAsync(token); + public Task InsertAsync(int idWell, LastDataDto data, CancellationToken token) + { + throw new System.NotImplementedException(); + } + + public Task MarkAsDeleteAsync(int idWell, int idData, CancellationToken token) + { + throw new System.NotImplementedException(); + } + + public Task UpdateAsync(int idWell, LastDataDto data, CancellationToken token) + { + throw new System.NotImplementedException(); + } + + public Task DeleteAsync(int idWell, int idData, CancellationToken token) + { + throw new System.NotImplementedException(); } } - } diff --git a/AsbCloudWebApi/Controllers/FluidController.cs b/AsbCloudWebApi/Controllers/FluidController.cs deleted file mode 100644 index d3ee8780..00000000 --- a/AsbCloudWebApi/Controllers/FluidController.cs +++ /dev/null @@ -1,17 +0,0 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace AsbCloudWebApi.Controllers -{ - [Route("api/well/{idWell}/fluidLastData")] - [ApiController] - [Authorize] - public class FluidController : LastDataController - { - public FluidController(ILastDataService lastDataService, - IWellService wellService) : base(lastDataService, wellService) - { } - } -} diff --git a/AsbCloudWebApi/Controllers/LastDataController.cs b/AsbCloudWebApi/Controllers/LastDataController.cs index 90a143ac..19bc0c36 100644 --- a/AsbCloudWebApi/Controllers/LastDataController.cs +++ b/AsbCloudWebApi/Controllers/LastDataController.cs @@ -1,4 +1,5 @@ -using AsbCloudApp.Services; +using AsbCloudApp.Data; +using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Threading; @@ -8,45 +9,86 @@ namespace AsbCloudWebApi.Controllers { [ApiController] [Authorize] - public abstract class LastDataController : ControllerBase where T : class + [Route("api/well/{idWell}/lastData")] + public class LastDataController: ControllerBase { - private readonly ILastDataService lastDataService; + private readonly ILastDataService lastDataService; private readonly IWellService wellService; - public LastDataController(ILastDataService lastDataService, IWellService wellService) + public LastDataController(ILastDataService lastDataService, IWellService wellService) { this.lastDataService = lastDataService; this.wellService = wellService; } [HttpGet] - public async Task GetAsync([FromRoute] int idWell, - [FromQuery] int idCategory, CancellationToken token = default) + [Route("categories")] + public async Task GetCategoriesAsync([FromRoute] int idWell, CancellationToken token = default) { - int? idCompany = User.GetCompanyId(); - - if (idCompany is null || !await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, - idWell, token).ConfigureAwait(false)) + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - var result = await lastDataService.GetAsync(idWell, - idCategory, token).ConfigureAwait(false); + var result = await lastDataService.GetCategoriesAsync(token).ConfigureAwait(false); + return Ok(result); + } + + [HttpGet] + [Route("last")] + public async Task GetAllLastAsync([FromRoute] int idWell, CancellationToken token = default) + { + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) + return Forbid(); + + var result = await lastDataService.GetAllLastAsync(idWell, token).ConfigureAwait(false); + return Ok(result); + } + + [HttpGet] + [Route("{idCategory}/history")] + public async Task GetHisoryAsync([FromRoute] int idWell, [FromQuery] int idCategory, CancellationToken token = default) + { + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) + return Forbid(); + + var result = await lastDataService.GetHisoryAsync(idWell, idCategory, token).ConfigureAwait(false); return Ok(result); } [HttpPost] - public async Task PutAsync([FromRoute] int idWell, - [FromQuery] int idCategory, T data, CancellationToken token = default) + public async Task InsertAsync([FromRoute] int idWell, LastDataDto data, CancellationToken token = default) { - int? idCompany = User.GetCompanyId(); - - if (idCompany is null || !await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, - idWell, token).ConfigureAwait(false)) + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - await lastDataService.UpsertAsync(idWell, - idCategory, data, token).ConfigureAwait(false); - return Ok(); + var result = await lastDataService.InsertAsync(idWell, data, token).ConfigureAwait(false); + return Ok(result); + } + + [HttpPut] + public async Task UpdateAsync([FromRoute] int idWell, LastDataDto data, CancellationToken token = default) + { + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) + return Forbid(); + + var result = await lastDataService.UpdateAsync(idWell, data, token).ConfigureAwait(false); + return Ok(result); + } + + [HttpDelete] + public async Task MarkAsDeleteAsync([FromRoute] int idWell, [FromRoute] int idData, CancellationToken token = default) + { + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) + return Forbid(); + + var result = await lastDataService.MarkAsDeleteAsync(idWell, idData, token).ConfigureAwait(false); + return Ok(result); + } + + private async Task CanUserAccessToWellAsync(int idWell, CancellationToken token = default) + { + int? idCompany = User.GetCompanyId(); + return idCompany is not null && await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, + idWell, token).ConfigureAwait(false); } } } diff --git a/AsbCloudWebApi/Controllers/MudDiagramController.cs b/AsbCloudWebApi/Controllers/MudDiagramController.cs deleted file mode 100644 index f34d9c0f..00000000 --- a/AsbCloudWebApi/Controllers/MudDiagramController.cs +++ /dev/null @@ -1,17 +0,0 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace AsbCloudWebApi.Controllers -{ - [Route("api/well/{idWell}/mudLastData")] - [ApiController] - [Authorize] - public class MudDiagramController : LastDataController - { - public MudDiagramController(ILastDataService lastDataService, - IWellService wellService) : base(lastDataService, wellService) - { } - } -} diff --git a/AsbCloudWebApi/Controllers/NnbDataController.cs b/AsbCloudWebApi/Controllers/NnbDataController.cs deleted file mode 100644 index 511d5149..00000000 --- a/AsbCloudWebApi/Controllers/NnbDataController.cs +++ /dev/null @@ -1,17 +0,0 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace AsbCloudWebApi.Controllers -{ - [Route("api/well/{idWell}/nnbLastData")] - [ApiController] - [Authorize] - public class NnbDataController : LastDataController - { - public NnbDataController(ILastDataService lastDataService, - IWellService wellService) : base(lastDataService, wellService) - { } - } -}