feat(api): HostController.Response Field, Value выделены в отдельные поля

This commit is contained in:
Mikhail Kuznetsov
2025-06-09 13:55:57 +10:00
parent 59b592fdd9
commit 0d08794636
8 changed files with 83 additions and 19 deletions

View File

@@ -0,0 +1,11 @@
namespace PARR.API.Contracts.V1.Requests.BaseRequests
{
public class FullQuery
{
/// <summary>
/// Полный запрос, включающий все данные
/// </summary>
public bool IsFull { get; set; }
}
}

View File

@@ -1,6 +1,8 @@
namespace PARR.API.Contracts.V1.Requests.Queries using PARR.API.Contracts.V1.Requests.BaseRequests;
namespace PARR.API.Contracts.V1.Requests.Queries
{ {
public class HostQuery public class HostQuery: FullQuery
{ {
/// <summary> /// <summary>
/// Поиск по маске ЭК. Например: "ВРТ-*-ДВС" /// Поиск по маске ЭК. Например: "ВРТ-*-ДВС"

View File

@@ -2,16 +2,14 @@
{ {
public class AttributeResponse public class AttributeResponse
{ {
public Guid Id { get; set; }
/// <summary> /// <summary>
/// Имя из поля DisplayName, если пустое - берём AihitName /// Имя из поля DisplayName, если пустое - берём AihitName
/// </summary> /// </summary>
public required string Name { get; set; } public required FieldResponse Field { get; set; }
/// <summary> /// <summary>
/// Соответствующее полю значение /// Соответствующее полю значение
/// </summary> /// </summary>
public required string Value { get; set; } public required ValueResponse Value { get; set; }
} }
} }

View File

@@ -0,0 +1,15 @@
namespace PARR.API.Contracts.V1.Responses
{
public class FieldBaseResponse
{
public Guid Id { get; set; }
public required string Name { get; set; }
}
public class FieldResponse : FieldBaseResponse
{
}
}

View File

@@ -1,6 +1,6 @@
namespace PARR.API.Contracts.V1.Responses namespace PARR.API.Contracts.V1.Responses
{ {
public class UnitResponse public class UnitBaseResponse
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
@@ -8,11 +8,29 @@
} }
public class UnitResponse : UnitBaseResponse
{
}
/// <summary> /// <summary>
/// Response с всеми аттребутами и их значениями /// Response с всеми аттребутами и их значениями
/// </summary> /// </summary>
public class UnitWithAttributesResponse : UnitResponse public class UnitWithAttributesResponse : UnitBaseResponse
{ {
public List<AttributeResponse>? Attributes { get; set; } public List<AttributeResponse>? Attributes { get; set; }
} }
} }

View File

@@ -0,0 +1,14 @@
namespace PARR.API.Contracts.V1.Responses
{
public class ValueBaseResponse
{
public Guid Id { get; set; }
public string Value { get; set; }
}
public class ValueResponse : ValueBaseResponse
{
}
}

View File

@@ -65,16 +65,18 @@ namespace PARR.API.Controllers.V1
//var paginationResponse = new PagedResponse<HostWithApplicationsResponse>(hostResponse, true).GetPaginatedProps(paginationFilter, query); //var paginationResponse = new PagedResponse<HostWithApplicationsResponse>(hostResponse, true).GetPaginatedProps(paginationFilter, query);
IQueryable<Unit> query = unitService.Get() IQueryable<Unit> query = unitService.Get()
.AsNoTracking()
.Include(t => t.UnitValues)
.ThenInclude(uv => uv.Value)
.Include(tf => tf.UnitValues)
.ThenInclude(uv => uv.Field)
.OrderBy(t => t.Name); .OrderBy(t => t.Name);
if (!string.IsNullOrEmpty(request.Mask)) if (!string.IsNullOrEmpty(request.Mask))
query = query.Where(t => EF.Functions.Like(t.Name.ToLower(), SqlHelpers.RegexToLike(request.Mask))); query = query.Where(t => EF.Functions.Like(t.Name.ToLower(), SqlHelpers.RegexToLike(request.Mask)));
if (request.IsFull)
query = query
.Include(t => t.UnitValues)
.ThenInclude(uv => uv.Value)
.Include(tf => tf.UnitValues)
.ThenInclude(uv => uv.Field);
var units = await unitService.GetPage(query, paginationFilter).ToListAsync(); var units = await unitService.GetPage(query, paginationFilter).ToListAsync();
if (!units.Any()) if (!units.Any())
@@ -108,12 +110,12 @@ namespace PARR.API.Controllers.V1
//var response = mapper.Map<HostWithApplicationsResponse>(host); //var response = mapper.Map<HostWithApplicationsResponse>(host);
var unit = await unitService.Get() var unit = await unitService.Get()
.AsNoTracking()
.Include(t => t.UnitValues) .Include(t => t.UnitValues)
.ThenInclude(uv => uv.Value) .ThenInclude(uv => uv.Value)
.Include(tf => tf.UnitValues) .Include(tf => tf.UnitValues)
.ThenInclude(uv => uv.Field) .ThenInclude(uv => uv.Field)
.FirstOrDefaultAsync(t => t.Id == id); .FirstOrDefaultAsync(t => t.Id == id);
if (unit == null) if (unit == null)
return NotFound(); return NotFound();

View File

@@ -106,12 +106,16 @@ namespace PARR.API.MappingProfiles
#region Unit #region Unit
CreateMap<UnitInValue, AttributeResponse>() CreateMap<UnitField, FieldResponse>()
.ForMember(d => d.Id, o => o.MapFrom(s => s.Value!.Id)) .ForMember(d => d.Name, o => o.MapFrom(s => (string.IsNullOrEmpty(s.DisplayName)) ? s.AihitName : s.DisplayName));
.ForMember(d => d.Name, o => o.MapFrom(s => (string.IsNullOrEmpty(s.Field!.DisplayName)) ? s.Field!.AihitName : s.Field!.DisplayName))
.ForMember(d => d.Value, o => o.MapFrom(s => s.Value!.Value));
CreateMap<Unit, UnitResponse>() CreateMap<UnitFieldValue, ValueResponse>();
CreateMap<UnitInValue, AttributeResponse>()
.ForMember(d => d.Field, o => o.MapFrom(s => s.Field))
.ForMember(d => d.Value, o => o.MapFrom(s => s.Value));
CreateMap<Unit, UnitBaseResponse>()
.Include<Unit, UnitWithAttributesResponse>() .Include<Unit, UnitWithAttributesResponse>()
.ForMember(d => d.Name, o => o.MapFrom(s => s.Name)); .ForMember(d => d.Name, o => o.MapFrom(s => s.Name));