Skip to content
Snippets Groups Projects

Fix: ProjectReporting to fetch project quotas individually and update API

Files

@@ -21,7 +21,8 @@ public class ProjectReporting
@@ -21,7 +21,8 @@ public class ProjectReporting
private readonly IStorageService _localStorageService;
private readonly IStorageService _localStorageService;
private readonly KpiConfiguration _kpiConfiguration;
private readonly KpiConfiguration _kpiConfiguration;
private readonly ReportingConfiguration _reportingConfiguration;
private readonly ReportingConfiguration _reportingConfiguration;
private readonly IAdminApi _adminApi;
private readonly IProjectCacheService _projectCacheService;
 
private readonly IProjectQuotaApi _projectQuotaApi;
public ProjectReportingOptions Options { get; private set; } = null!;
public ProjectReportingOptions Options { get; private set; } = null!;
public string ReportingFileName { get; }
public string ReportingFileName { get; }
@@ -33,7 +34,8 @@ public class ProjectReporting
@@ -33,7 +34,8 @@ public class ProjectReporting
[FromKeyedServices("local")] IStorageService localStorageService,
[FromKeyedServices("local")] IStorageService localStorageService,
IOptionsMonitor<KpiConfiguration> kpiConfiguration,
IOptionsMonitor<KpiConfiguration> kpiConfiguration,
IOptionsMonitor<ReportingConfiguration> reportingConfiguration,
IOptionsMonitor<ReportingConfiguration> reportingConfiguration,
IAdminApi adminApi
IProjectCacheService projectCacheService,
 
IProjectQuotaApi projectQuotaApi
)
)
{
{
_mapper = mapper;
_mapper = mapper;
@@ -44,7 +46,8 @@ public class ProjectReporting
@@ -44,7 +46,8 @@ public class ProjectReporting
_reportingConfiguration = reportingConfiguration.CurrentValue;
_reportingConfiguration = reportingConfiguration.CurrentValue;
ReportingFileName = _kpiConfiguration.ProjectKpi.FileName;
ReportingFileName = _kpiConfiguration.ProjectKpi.FileName;
_adminApi = adminApi;
_projectCacheService = projectCacheService;
 
_projectQuotaApi = projectQuotaApi;
}
}
public async Task<bool> RunAsync(ProjectReportingOptions reportingOptions)
public async Task<bool> RunAsync(ProjectReportingOptions reportingOptions)
@@ -81,16 +84,36 @@ public class ProjectReporting
@@ -81,16 +84,36 @@ public class ProjectReporting
public virtual async Task<IEnumerable<ReportingFileObject>> GenerateReportingAsync()
public virtual async Task<IEnumerable<ReportingFileObject>> GenerateReportingAsync()
{
{
_logger.LogDebug("Working on projects asynchronously...");
_logger.LogDebug("Working on projects asynchronously...");
var projects = PaginationHelper.GetAllAsync<ProjectAdminDtoPagedResponse, ProjectAdminDto>(
var projects = await _projectCacheService.GetAllProjectsAsync();
(currentPage) => _adminApi.GetAllProjectsAsync(includeDeleted: false, includeQuotas: true, includePublicationRequests: true, pageNumber: currentPage, pageSize: 50));
_logger.LogInformation("Found {count} projects.", projects.Count);
 
 
// Filter out projects that are deleted
 
projects = [.. projects.Where(p => !p.Deleted)];
 
_logger.LogInformation("Filtered out deleted projects. Remaining projects: {count}", projects.Count);
var reportingFiles = new List<ReportingFileObject>();
var reportingFiles = new List<ReportingFileObject>();
var returnObjects = new List<ProjectReport>();
var returnObjects = new List<ProjectReport>();
// Additional processing
// Additional processing
await foreach (var project in projects)
foreach (var project in projects)
{
{
_logger.LogDebug("Processing project {projectId}...", project.Id);
_logger.LogDebug("Processing project {projectId}...", project.Id);
 
var quotas = PaginationHelper.GetAllAsync<ProjectQuotaDtoPagedResponse, ProjectQuotaDto>(
 
(currentPage) =>
 
{
 
_logger.LogDebug("Getting page {page} of quotas for project {projectId}...", currentPage, project.Id);
 
return _projectQuotaApi.GetProjectQuotasAsync(project.Id.ToString(), pageNumber: currentPage, pageSize: 50);
 
});
 
await foreach (var quota in quotas)
 
{
 
if (quota == null)
 
{
 
_logger.LogWarning("Quota for project {projectId} is null, skipping...", project.Id);
 
continue;
 
}
 
// Map the quota to the project
 
project.ProjectQuota.Add(quota);
 
}
var returnObject = _mapper.Map<ProjectReport>(project);
var returnObject = _mapper.Map<ProjectReport>(project);
returnObjects.Add(returnObject);
returnObjects.Add(returnObject);
}
}
Loading