< Summary - pva.SuperV

Information
Class: pva.SuperV.Api.Services.Projects.ProjectService
Assembly: pva.SuperV.Api
File(s): /home/runner/work/pva.SuperV/pva.SuperV/pva.SuperV.Api/Services/Projects/ProjectService.cs
Tag: dotnet-ubuntu_22190969454
Line coverage
90%
Covered lines: 102
Uncovered lines: 11
Coverable lines: 113
Total lines: 163
Line coverage: 90.2%
Branch coverage
71%
Covered branches: 10
Total branches: 14
Branch coverage: 71.4%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetProjectsAsync()100%11100%
GetProjectAsync()100%11100%
SearchProjectsAsync()100%11100%
CreateProjectAsync()100%11100%
CreateProjectFromRunnableAsync()50%2288.88%
UpdateProjectAsync()50%2290.9%
BuildProjectAsync()100%22100%
GetProjectDefinitionsAsync()100%11100%
CreateProjectFromJsonDefinitionAsync()100%11100%
GetProjectInstancesAsync()100%22100%
LoadProjectInstancesAsync()100%22100%
UnloadProjectAsync()100%11100%
GetProjectTopicNames()0%620%
FilterProjects(...)100%22100%

File(s)

/home/runner/work/pva.SuperV/pva.SuperV/pva.SuperV.Api/Services/Projects/ProjectService.cs

#LineLine coverage
 1using pva.SuperV.Api.Exceptions;
 2using pva.SuperV.Api.Mappers;
 3using pva.SuperV.Engine;
 4using pva.SuperV.Engine.Exceptions;
 5using pva.SuperV.Model;
 6using pva.SuperV.Model.Projects;
 7using pva.SuperV.Model.Services;
 8
 9namespace pva.SuperV.Api.Services.Projects
 10{
 11    public class ProjectService : BaseService, IProjectService
 12    {
 13        private readonly ILogger logger;
 2114        private readonly Dictionary<string, Comparison<ProjectModel>> sortOptions = new()
 2115            {
 10416                { "name", new Comparison<ProjectModel>((a, b) => a.Name.CompareTo(b.Name)) }
 2117            };
 18
 2119        public ProjectService(ILoggerFactory loggerFactory)
 2120        {
 2121            this.logger = loggerFactory.CreateLogger(this.GetType());
 2122        }
 23
 24        public async Task<List<ProjectModel>> GetProjectsAsync()
 925        {
 926            logger.LogDebug("Getting projects");
 9727            return await Task.FromResult(Project.Projects.Values.Select(project => ProjectMapper.ToDto(project)).ToList(
 928        }
 29
 30        public async Task<ProjectModel> GetProjectAsync(string projectId)
 331        {
 332            logger.LogDebug("Getting project {ProjectId}",
 333                projectId);
 334            return await Task.FromResult(ProjectMapper.ToDto(GetProjectEntity(projectId)));
 135        }
 36
 37        public async Task<PagedSearchResult<ProjectModel>> SearchProjectsAsync(ProjectPagedSearchRequest search)
 838        {
 839            logger.LogDebug("Searching projects with filter {NameFilter} page number {PageNumber} page size {PageSize}",
 840                search.NameFilter, search.PageNumber, search.PageSize);
 841            List<ProjectModel> allProjects = await GetProjectsAsync();
 842            List<ProjectModel> projects = FilterProjects(allProjects, search);
 843            projects = SortResult(projects, search.SortOption, sortOptions);
 744            return CreateResult(search, allProjects, projects);
 745        }
 46
 47        public async Task<ProjectModel> CreateProjectAsync(CreateProjectRequest createProjectRequest)
 348        {
 349            logger.LogDebug("Creating project {ProjectId} with description {ProjectDescription} with history connection 
 350                createProjectRequest.Name, createProjectRequest.Description, createProjectRequest.HistoryStorageConnecti
 351            WipProject wipProject = Project.CreateProject(createProjectRequest.Name, createProjectRequest.HistoryStorage
 352            wipProject.Description = createProjectRequest.Description;
 353            return await Task.FromResult(ProjectMapper.ToDto(wipProject));
 354        }
 55
 56        public async Task<ProjectModel> CreateProjectFromRunnableAsync(string runnableProjectId)
 157        {
 158            logger.LogDebug("Creating project {ProjectId} from runnable",
 159                runnableProjectId);
 160            if (GetProjectEntity(runnableProjectId) is RunnableProject runnableProject)
 161            {
 162                WipProject wipProject = Project.CreateProject(runnableProject);
 163                return await Task.FromResult(ProjectMapper.ToDto(wipProject));
 64            }
 065            throw new NonRunnableProjectException(runnableProjectId);
 166        }
 67
 68        public async Task<ProjectModel> UpdateProjectAsync(string projectId, UpdateProjectRequest updateProjectRequest)
 169        {
 170            logger.LogDebug("Updating project {ProjectId} with description {ProjectDescription} with history connection 
 171                projectId, updateProjectRequest.Description, updateProjectRequest.HistoryStorageConnectionString);
 172            Project? projectToUpdate = GetProjectEntity(projectId);
 173            if (projectToUpdate is not null)
 174            {
 175                projectToUpdate.Description = updateProjectRequest.Description;
 176                projectToUpdate.HistoryStorageEngineConnectionString = updateProjectRequest.HistoryStorageConnectionStri
 177                return await Task.FromResult(ProjectMapper.ToDto(projectToUpdate));
 78            }
 079            return await Task.FromException<ProjectModel>(new UnknownEntityException("Project", projectId));
 180        }
 81
 82        public async Task<ProjectModel> BuildProjectAsync(string projectId)
 383        {
 384            logger.LogDebug("Building project {ProjectId}",
 385                projectId);
 386            if (GetProjectEntity(projectId) is WipProject wipProject)
 287            {
 288                RunnableProject runnableProject = await Project.BuildAsync(wipProject);
 289                return ProjectMapper.ToDto(runnableProject);
 90            }
 191            throw new NonWipProjectException(projectId);
 292        }
 93
 94        public async Task<Stream?> GetProjectDefinitionsAsync(string projectId)
 195        {
 196            logger.LogDebug("Getting project {ProjectId} definitions",
 197                projectId);
 198            Project project = GetProjectEntity(projectId);
 199            StreamWriter stream = new(new MemoryStream());
 1100            return await ProjectStorage.StreamProjectDefinitionAsync(project, stream);
 1101        }
 102
 103        public async Task<ProjectModel> CreateProjectFromJsonDefinitionAsync(StreamReader streamReader)
 1104        {
 1105            return await Task.FromResult(ProjectMapper.ToDto(ProjectStorage.CreateProjectFromJsonDefinition<RunnableProj
 1106        }
 107
 108        public async Task<Stream?> GetProjectInstancesAsync(string projectId)
 2109        {
 2110            logger.LogDebug("Getting project {ProjectId} instances",
 2111                projectId);
 2112            if (GetProjectEntity(projectId) is RunnableProject runnableProject)
 1113            {
 1114                StreamWriter stream = new(new MemoryStream());
 1115                return await ProjectStorage.StreamProjectInstancesAsync(runnableProject, stream);
 116            }
 1117            throw new NonRunnableProjectException(projectId);
 1118        }
 119
 120        public async ValueTask LoadProjectInstancesAsync(string projectId, StreamReader reader)
 2121        {
 2122            logger.LogDebug("Loading project {ProjectId} instances",
 2123                projectId);
 2124            if (GetProjectEntity(projectId) is RunnableProject runnableProject)
 1125            {
 1126                ProjectStorage.LoadProjectInstances(runnableProject, reader);
 1127                await ValueTask.CompletedTask;
 1128                return;
 129            }
 1130            await ValueTask.FromException(new NonRunnableProjectException(projectId));
 1131        }
 132
 133        public async ValueTask UnloadProjectAsync(string projectId)
 1134        {
 1135            logger.LogDebug("Unloading project {ProjectId}",
 1136                projectId);
 1137            GetProjectEntity(projectId).Unload();
 1138            await ValueTask.CompletedTask;
 1139        }
 140
 141        public async Task<HashSet<string>> GetProjectTopicNames(string projectId)
 0142        {
 0143            logger.LogDebug("Getting project {ProjectId} topic names",
 0144                projectId);
 0145            Project? project = GetProjectEntity(projectId);
 0146            if (project is not null)
 0147            {
 0148                return await Task.FromResult(project.GetTopicNames());
 149            }
 0150            return await Task.FromException<HashSet<string>>(new UnknownEntityException("Project", projectId));
 151
 0152        }
 153        private static List<ProjectModel> FilterProjects(List<ProjectModel> allProjects, ProjectPagedSearchRequest searc
 8154        {
 8155            List<ProjectModel> filteredProjects = allProjects;
 8156            if (!String.IsNullOrEmpty(search.NameFilter))
 1157            {
 13158                filteredProjects = [.. filteredProjects.Where(project => project.Name.Contains(search.NameFilter))];
 1159            }
 8160            return filteredProjects;
 8161        }
 162    }
 163}