feat(api): оптимизация запросов в AppInWorks при подсчете кол-ва шаблонов

This commit is contained in:
Mikhail Trubnikov
2024-06-21 11:51:41 +10:00
parent 8722be0d87
commit 19a812034d

View File

@@ -26,13 +26,15 @@ namespace PARR.API.Controllers.V1
private readonly IApplicationsInWorkService applicationsInWorkService;
private readonly IValidator<ApplicationInWorkRequest> validator;
private readonly IUriService uriService;
private readonly ITemplateService templateService;
public ApplicationInWorkController(
ILogger<ApplicationInWorkController> logger,
IMapper mapper,
IApplicationsInWorkService applicationsInWorkService,
IValidator<ApplicationInWorkRequest> validator,
IUriService uriService
IUriService uriService,
ITemplateService templateService
)
{
this.logger = logger;
@@ -40,6 +42,7 @@ namespace PARR.API.Controllers.V1
this.applicationsInWorkService = applicationsInWorkService;
this.validator = validator;
this.uriService = uriService;
this.templateService = templateService;
}
@@ -58,7 +61,7 @@ namespace PARR.API.Controllers.V1
{
query = query
.Include(t => t.Work)
.Include(t => t.Templates)
//.Include(t => t.Templates) - большой запрос, делаем его отдельно
.Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup);
}
@@ -76,6 +79,16 @@ namespace PARR.API.Controllers.V1
return NoContent();
var response = mapper.Map<List<ApplicationInWorkResponse>>(appInWorks);
if (filter.IsLight != true)
{
//Если запрос не легкий, закгружаем кол-во шаблонов отдельно, это значительно ускоряет запрос
foreach (var item in response)
{
item.TemplatesCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == item.Id);
}
}
var paginationResponse = new PagedResponse<ApplicationInWorkResponse>(response, true).GetPaginatedProps(paginationFilter, query);
return Ok(paginationResponse);
@@ -93,7 +106,7 @@ namespace PARR.API.Controllers.V1
var applicationInWork = await applicationsInWorkService.Get()
.Include(t => t.Application).ThenInclude(t => t!.ApplicationType)
.Include(t => t.Work)
.Include(t => t.Templates)
//.Include(t => t.Templates)
.Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup)
.FirstOrDefaultAsync(t => t.Id == id);
@@ -101,6 +114,7 @@ namespace PARR.API.Controllers.V1
return NotFound();
var response = mapper.Map<ApplicationInWorkResponse>(applicationInWork);
response.TemplatesCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == id);
return Ok(new Response<ApplicationInWorkResponse>(response, true));
}
@@ -170,13 +184,17 @@ namespace PARR.API.Controllers.V1
var createdApplicationInWork = await applicationsInWorkService.Get()
.Include(t => t.Application).ThenInclude(t => t!.ApplicationType)
.Include(t => t.Work)
.Include(t => t.Templates)
//.Include(t => t.Templates)
.Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup)
.FirstAsync(t => t.Id == applicationInWork.Id);
var locationUri = uriService.GetUri(ApiRoutes.Job.Get, ApiRoutes.Job.getParam, createdApplicationInWork.Id);
return Created(locationUri, new Response<ApplicationInWorkResponse>(mapper.Map<ApplicationInWorkResponse>(createdApplicationInWork), true));
var response = mapper.Map<ApplicationInWorkResponse>(createdApplicationInWork);
// так как мы только что создали AppInW, то у него нет шаблонов, смело ставим = 0 (ускоряем запрос)
response.TemplatesCount = 0;
return Created(locationUri, new Response<ApplicationInWorkResponse>(response, true));
}
@@ -255,11 +273,14 @@ namespace PARR.API.Controllers.V1
var updatedApplicationInWork = await applicationsInWorkService.Get()
.Include(t => t.Application).ThenInclude(t => t!.ApplicationType)
.Include(t => t.Work)
.Include(t => t.Templates)
//.Include(t => t.Templates)
.Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup)
.FirstAsync(t => t.Id == orig.Id);
return Ok(new Response<ApplicationInWorkResponse>(mapper.Map<ApplicationInWorkResponse>(updatedApplicationInWork), true));
var response = mapper.Map<ApplicationInWorkResponse>(updatedApplicationInWork);
response.TemplatesCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == id);
return Ok(new Response<ApplicationInWorkResponse>(response, true));
}
@@ -273,7 +294,7 @@ namespace PARR.API.Controllers.V1
public async Task<IActionResult> Delete([FromRoute] Guid id)
{
var applicationsInWork = await applicationsInWorkService.Get()
.Include(t => t.Templates)
//.Include(t => t.Templates)
.FirstOrDefaultAsync(t => t.Id == id);
if (applicationsInWork == null)
@@ -281,9 +302,12 @@ namespace PARR.API.Controllers.V1
Message = $"Ошибка при удалении задания на выполнение работ. Не найдено задание на выполнение работ Id: {id}"
} }));
if (applicationsInWork.Templates.Any())
var templateCount = await templateService.Get().CountAsync(t => t.ApplicationInWorkId == id);
//if (applicationsInWork.Templates.Any())
if (templateCount > 0)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel {
Message = $"Ошибка при удалении задания на выполнение работ. С данным заданием связаны шаблоны: {applicationsInWork.Templates.Count()} шт."
Message = $"Ошибка при удалении задания на выполнение работ. С данным заданием связаны шаблоны: {templateCount} шт."
} }));
if (!applicationsInWorkService.Delete(applicationsInWork) || !await applicationsInWorkService.CommitAsync())