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