public async Task <IEnumerable <GitLabProjectOverview> > GetProjects(int page, int pageSize) { var gitLabCommits = await _repository.GetPaged(page, pageSize); var projectIds = new HashSet <int>(); foreach (var project in gitLabCommits) { projectIds.Add(project.Project_id); } var projectsLatestBaseScore = new Dictionary <int, double>(); var projectsLatestAccumulatedScore = new Dictionary <int, double>(); foreach (var projectId in projectIds) { var project = await _gitLabProjectRepository.GetProjectByProjectId(projectId); GitLabProjectDirectory latestProjectDirectory = null; // Get latest up to date projectDirectory foreach (var directory in project.ProjectHistory) { if (latestProjectDirectory == null) { latestProjectDirectory = directory; continue; } if (latestProjectDirectory.CreatedAt.CompareTo(directory.CreatedAt) < 0) { latestProjectDirectory = directory; } } var baseScoreSum = 0.0; var accumulatedScoreSum = 0.0; var baseScoreAverage = 0.0; var accumulatedScoreAverage = 0.0; if (latestProjectDirectory != null) { foreach (var fileDataScore in latestProjectDirectory.FileDataScores) { baseScoreSum += fileDataScore.BaseScore; accumulatedScoreSum += fileDataScore.AccumulatedCodeScore; } if (latestProjectDirectory.FileDataScores.Any()) { baseScoreAverage = baseScoreSum / latestProjectDirectory.FileDataScores.Count(); accumulatedScoreAverage = accumulatedScoreSum / latestProjectDirectory.FileDataScores.Count(); } } projectsLatestBaseScore[projectId] = baseScoreAverage; projectsLatestAccumulatedScore[projectId] = accumulatedScoreAverage; } var list = new List <GitLabProjectOverview>(); // Sum the average score of different projects foreach (var project in gitLabCommits) { if (list.All(t => t.ProjectId != project.Project_id)) { list.Add(new GitLabProjectOverview { Name = project.Project_name, ProjectId = project.Project_id, AverageProjectScore = projectsLatestBaseScore[project.Project_id], AccumulatedAverageProjectScore = projectsLatestAccumulatedScore[project.Project_id] }); } } return(list); }
public async Task UpdateProject(int projectId, string projectName, string commitSha, IEnumerable <string> files, IEnumerable <GitLabFileDataScore> dataScores) { // Check if project already exist with projectId var project = await _gitLabProjectRepository.GetProjectByProjectId(projectId); if (project == null) { // Create a new project with the respective information await _gitLabProjectRepository.Insert(new GitLabProject { Project_id = projectId, Project_name = projectName, ProjectHistory = new List <GitLabProjectDirectory> { new GitLabProjectDirectory { Commit_Sha = commitSha, FileDataScores = dataScores, Files = files } } }); } else { // Create new GitLabProjectDirectory var projectDirectory = new GitLabProjectDirectory(); projectDirectory.Commit_Sha = commitSha; GitLabProjectDirectory latestProjectDirectory = null; // Get latest up to date projectDirectory foreach (var directory in project.ProjectHistory) { if (latestProjectDirectory == null) { latestProjectDirectory = directory; continue; } if (latestProjectDirectory.CreatedAt.CompareTo(directory.CreatedAt) < 0) { latestProjectDirectory = directory; } } // Update the file list with modified and addedFiles var copyFiles = new List <string>(latestProjectDirectory.Files); foreach (var file in files) { if (!copyFiles.Contains(file)) { copyFiles.Add(file); } } var copyFileDataScore = new List <GitLabFileDataScore>(latestProjectDirectory.FileDataScores); foreach (var dataScore in dataScores) { if (copyFileDataScore.Any(t => t.FileName == dataScore.FileName)) { // Update content var update = copyFileDataScore.SingleOrDefault(t => t.FileName == dataScore.FileName); copyFileDataScore.Remove(update); copyFileDataScore.Add(new GitLabFileDataScore { Ref = dataScore.Ref, FileName = dataScore.FileName, BaseScore = dataScore.BaseScore, AccumulatedCodeScore = dataScore.AccumulatedCodeScore, DetailedScoreDict = dataScore.DetailedScoreDict }); } else { copyFileDataScore.Add(dataScore); } } projectDirectory.Files = copyFiles; projectDirectory.FileDataScores = copyFileDataScore; project.ProjectHistory.Add(projectDirectory); await _gitLabProjectRepository.UpdateProjectDirectory(project.Id, project.ProjectHistory); } }