using Core; using Core.Process; using Core.SpecConfig; using Generator.Repo; namespace Generator.Services; public class PublicationService { private readonly PublisherRepo _publisherRepo; private readonly RepositoryService _repoService; public PublicationService( PublisherRepo pubRepo, RepositoryService repoService) { _publisherRepo = pubRepo; _repoService = repoService; } public async Task Publish(GenerationProcess process) { foreach (var task in process) { switch (task.Language) { case Language.Dotnet: await PublishDotnet(task); break; case Language.Java: await PublishJava(task); break; case Language.Javascript: await PublishJavascript(task); break; default: throw new ArgumentOutOfRangeException(); } } } public async Task PublishDotnet(ProcessTask task) { while (task.Tasks.TryDequeue(out var file)) { await PublishDotnet(file, task.GenerationType, task.PublishType); } } public async Task PublishJava(ProcessTask task) { while (task.Tasks.TryDequeue(out var file)) { await PublishJava(file, task.GenerationType, task.PublishType); } } public async Task PublishJavascript(ProcessTask task) { while (task.Tasks.TryDequeue(out var file)) { await PublishJavascript(file, task.GenerationType, task.PublishType); } } public async Task PublishDotnet(ISpecFile file, GenerationType genType, PublishType pubType) { var data = await _repoService.GetVersions(Language.Dotnet, file.NugetPackage); var package = data.FirstOrDefault(pd => pd.Version == file.Version); if(pubType == PublishType.Force) { if (package != null) await _repoService.DeletePackage(package.Id); await _publisherRepo.PublishDotnet(genType, file); return; } if(pubType == PublishType.Safe) { if (package == null) await _publisherRepo.PublishDotnet(genType, file); else Console.WriteLine($"The version {file.Version} of package {file.NugetPackage} already exists on the repository"); } } public async Task PublishJava(ISpecFile file, GenerationType genType, PublishType pubType) { var artifact = $"{file.Name}-api"; var data = await _repoService.GetVersions(Language.Java, artifact); var package = data.FirstOrDefault(pd => pd.Version == file.Version); if(pubType == PublishType.Force) { if (package != null) await _repoService.DeletePackage(package.Id); await _publisherRepo.PublishJava(genType, file); return; } if(pubType == PublishType.Safe) { if (package == null) await _publisherRepo.PublishJava(genType, file); else Console.WriteLine($"The version {file.Version} of package {artifact} already exists on the repository"); } } public async Task PublishJavascript(ISpecFile file, GenerationType genType, PublishType pubType) { var data = await _repoService.GetVersions(Language.Javascript, file.NpmPackage); var package = data.FirstOrDefault(pd => pd.Version == file.Version); if(pubType == PublishType.Force) { if (package != null) await _repoService.DeletePackage(package.Id); await _publisherRepo.PublishJavascript(genType, file); return; } if(pubType == PublishType.Safe) { if (package == null) await _publisherRepo.PublishJavascript(genType, file); else Console.WriteLine($"The version {file.Version} of package {file.NpmPackage} already exists on the repository"); } } }