public Task <bool> Validate(SolutionDao solution, out InvalidSolutionDao invalidSolutionModel, CancellationToken token = default) { // Validate if each package has proper name List <InvalidPorojectDao> invalidProjects = null; foreach (var project in solution.Projects) { var invalidPackages = project.Packages.Where(p => string.IsNullOrEmpty(p.PackageName)); int totalPackages = project.Packages.Count(); if (!invalidPackages.Any()) { continue; } invalidProjects ??= new List <InvalidPorojectDao>(); var invalidProject = new InvalidPorojectDao() { InvalidPackages = invalidPackages.Select(p => new InvalidPackageDao() { Name = p.PackageName, Version = p.PackageVersion, }), FailedPackages = invalidPackages.Count(), TotalPackages = totalPackages, Uri = project.Url }; invalidProjects.Add(invalidProject); solution.FailedPackages += invalidPackages.Count(); solution.TotalPackages += totalPackages; } if (invalidProjects != null) { var invalidSolution = new InvalidSolutionDao() { Uri = solution.Url, ScrappingDate = DateTime.Now, InvalidProjects = invalidProjects, }; invalidSolutionModel = invalidSolution; // strip invalid projects, we will scrap them later //solution.Projects = solution.Projects.Where(p => !invalidProjects.Any(ip => p.Url == ip.Uri)); if (invalidProjects.Count() / solution.Projects.Count() > this.options.Value.FailedPackagesThreshold) { return(Task.FromResult(false)); } } invalidSolutionModel = null; return(Task.FromResult(true)); }
public async Task CreateSolution(SolutionDao solution, CancellationToken cancellationToken = default) { await lockObject.WaitAsync(cancellationToken); try { var solutions = await this.GetSolutionsInternal(cancellationToken); if (!solutions.Any(s => s.Url == solution.Url)) { var newSolutions = solutions.Concat(new SolutionDao[] { solution }); var stringContent = JsonSerializer.Serialize(newSolutions); await File.WriteAllTextAsync(JsonPath, stringContent, cancellationToken); } } finally { lockObject.Release(); } }