< Summary - pva.SuperV

Information
Class: pva.SuperV.Api.Services.Classes.ClassService
Assembly: pva.SuperV.Api
File(s): /home/runner/work/pva.SuperV/pva.SuperV/pva.SuperV.Api/Services/Classes/ClassService.cs
Tag: dotnet-ubuntu_22190969454
Line coverage
93%
Covered lines: 58
Uncovered lines: 4
Coverable lines: 62
Total lines: 96
Line coverage: 93.5%
Branch coverage
58%
Covered branches: 7
Total branches: 12
Branch coverage: 58.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetClassesAsync()100%11100%
SearchClassesAsync()100%11100%
GetClassAsync(...)100%11100%
CreateClassAsync(...)50%2287.5%
UpdateClassAsync(...)50%6681.81%
DeleteClassAsync(...)50%2288.88%
FilterClasses(...)100%22100%

File(s)

/home/runner/work/pva.SuperV/pva.SuperV/pva.SuperV.Api/Services/Classes/ClassService.cs

#LineLine coverage
 1using pva.SuperV.Api.Exceptions;
 2using pva.SuperV.Api.Mappers;
 3using pva.SuperV.Engine;
 4using pva.SuperV.Model;
 5using pva.SuperV.Model.Classes;
 6using pva.SuperV.Model.Services;
 7
 8namespace pva.SuperV.Api.Services.Classes
 9{
 10    public class ClassService : BaseService, IClassService
 11    {
 12        private readonly ILogger logger;
 1213        private readonly Dictionary<string, Comparison<ClassModel>> sortOptions = new()
 1214            {
 8815                { "name", new Comparison<ClassModel>((a, b) => a.Name.CompareTo(b.Name)) }
 1216            };
 17
 18
 1219        public ClassService(ILoggerFactory loggerFactory)
 1220        {
 1221            logger = loggerFactory.CreateLogger(this.GetType());
 1222        }
 23
 24        public async Task<List<ClassModel>> GetClassesAsync(string projectId)
 1225        {
 1226            logger.LogDebug("Getting classes for project {ProjectId}", projectId);
 1227            Project project = GetProjectEntity(projectId);
 12728            return await Task.FromResult(project.Classes.Values.Select(clazz => ClassMapper.ToDto(clazz)).ToList());
 1229        }
 30
 31        public async Task<PagedSearchResult<ClassModel>> SearchClassesAsync(string projectId, ClassPagedSearchRequest se
 1032        {
 1033            logger.LogDebug("Searching classes for project {ProjectId} with filter {NameFilter} page number {PageNumber}
 1034                projectId, search.NameFilter, search.PageNumber, search.PageSize);
 1035            List<ClassModel> allClasses = await GetClassesAsync(projectId);
 1036            List<ClassModel> projects = FilterClasses(allClasses, search);
 1037            projects = SortResult(projects, search.SortOption, sortOptions);
 938            return CreateResult(search, allClasses, projects);
 939        }
 40
 41        public Task<ClassModel> GetClassAsync(string projectId, string className)
 242        {
 243            logger.LogDebug("Getting class {ClassName} for project {ProjectId}",
 244                className, projectId);
 245            return Task.FromResult(ClassMapper.ToDto(GetClassEntity(projectId, className)));
 146        }
 47
 48        public Task<ClassModel> CreateClassAsync(string projectId, ClassModel createRequest)
 449        {
 450            logger.LogDebug("Creating class {ClassName} with base class {BaseClassName} for project {ProjectId}",
 451                createRequest.Name, createRequest.BaseClassName, projectId);
 452            if (GetProjectEntity(projectId) is WipProject wipProject)
 453            {
 454                return Task.FromResult(ClassMapper.ToDto(wipProject.AddClass(createRequest!.Name, createRequest!.BaseCla
 55            }
 056            return Task.FromException<ClassModel>(new NonWipProjectException(projectId));
 457        }
 58
 59        public Task<ClassModel> UpdateClassAsync(string projectId, string className, ClassModel updateRequest)
 160        {
 161            logger.LogDebug("Updating class {ClassName} with base class {BaseClassName} for project {ProjectId}",
 162                updateRequest.Name, updateRequest.BaseClassName, projectId);
 163            if (GetProjectEntity(projectId) is WipProject wipProject)
 164            {
 165                if (updateRequest.Name?.Equals(className) != false)
 166                {
 167                    return Task.FromResult(ClassMapper.ToDto(wipProject.UpdateClass(className, updateRequest!.BaseClassN
 68                }
 069                return Task.FromException<ClassModel>(new EntityPropertyNotChangeableException("class", "Name"));
 70            }
 071            return Task.FromException<ClassModel>(new NonWipProjectException(projectId));
 172        }
 73
 74        public ValueTask DeleteClassAsync(string projectId, string className)
 175        {
 176            logger.LogDebug("Deleting class {ClassName} for project {ProjectId}",
 177                className, projectId);
 178            if (GetProjectEntity(projectId) is WipProject wipProject)
 179            {
 180                wipProject.RemoveClass(className);
 181                return ValueTask.CompletedTask;
 82            }
 083            return ValueTask.FromException(new NonWipProjectException(projectId));
 184        }
 85        private static List<ClassModel> FilterClasses(List<ClassModel> allClasses, ClassPagedSearchRequest search)
 1086        {
 1087            List<ClassModel> filteredClasses = allClasses;
 1088            if (!String.IsNullOrEmpty(search.NameFilter))
 389            {
 2390                filteredClasses = [.. filteredClasses.Where(clazz => clazz.Name.Contains(search.NameFilter))];
 391            }
 1092            return filteredClasses;
 1093        }
 94    }
 95}
 96