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