feat(api): оптимизация запросов в AppInWorks при подсчете кол-ва шаблонов
This commit is contained in:
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user