< Summary - pva.SuperV

Information
Class: pva.SuperV.Api.Services.Instances.InstanceService
Assembly: pva.SuperV.Api
File(s): /home/runner/work/pva.SuperV/pva.SuperV/pva.SuperV.Api/Services/Instances/InstanceService.cs
Tag: dotnet-ubuntu_22190969454
Line coverage
84%
Covered lines: 79
Uncovered lines: 14
Coverable lines: 93
Total lines: 131
Line coverage: 84.9%
Branch coverage
75%
Covered branches: 18
Total branches: 24
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%1187.5%
GetInstancesAsync()50%2287.5%
SearchInstancesAsync()100%11100%
GetInstanceAsync()75%4490.9%
CreateInstanceAsync()50%2288.88%
DeleteInstanceAsync()0%620%
FilterInstances(...)100%44100%
FilterInstanceClass(...)100%88100%

File(s)

/home/runner/work/pva.SuperV/pva.SuperV/pva.SuperV.Api/Services/Instances/InstanceService.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.Instances;
 7using pva.SuperV.Model.Services;
 8
 9namespace pva.SuperV.Api.Services.Instances
 10{
 11    public class InstanceService : BaseService, IInstanceService
 12    {
 13        private readonly ILogger logger;
 1314        private readonly Dictionary<string, Comparison<InstanceModel>> sortOptions = new()
 1315            {
 016                { "name", new Comparison<InstanceModel>((a, b) => a.Name.CompareTo(b.Name)) }
 1317            };
 18
 1319        public InstanceService(ILoggerFactory loggerFactory)
 1320        {
 1321            this.logger = loggerFactory.CreateLogger(this.GetType());
 1322        }
 23
 24        public async Task<List<InstanceModel>> GetInstancesAsync(string projectId)
 925        {
 926            logger.LogDebug("Getting instances for project {ProjectId}",
 927                projectId);
 928            if (GetProjectEntity(projectId) is RunnableProject runnableProject)
 929            {
 930                return await Task.FromResult(runnableProject.Instances.Values.Select(InstanceMapper.ToDto).ToList());
 31            }
 032            return await Task.FromException<List<InstanceModel>>(new NonRunnableProjectException(projectId));
 933        }
 34
 35        public async Task<PagedSearchResult<InstanceModel>> SearchInstancesAsync(string projectId, InstancePagedSearchRe
 836        {
 837            logger.LogDebug("Searching instances for project {ProjectId} with filter {NameFilter} class {ClassNameFilter
 838                projectId, search.NameFilter, search.ClassName, search.PageNumber, search.PageSize);
 839            List<InstanceModel> allInstances = await GetInstancesAsync(projectId);
 840            List<InstanceModel> projects = FilterInstances(projectId, allInstances, search);
 841            projects = SortResult(projects, search.SortOption, sortOptions);
 742            return CreateResult(search, allInstances, projects);
 43
 744        }
 45
 46        public async Task<InstanceModel> GetInstanceAsync(string projectId, string instanceName)
 247        {
 248            logger.LogDebug("Getting instance {InstanceName} for project {ProjectId}",
 249                instanceName, projectId);
 250            if (GetProjectEntity(projectId) is RunnableProject runnableProject)
 251            {
 252                if (runnableProject.Instances.TryGetValue(instanceName, out Instance? instance))
 153                {
 154                    return await Task.FromResult(InstanceMapper.ToDto(instance));
 55                }
 156                return await Task.FromException<InstanceModel>(new UnknownEntityException("Instance", instanceName));
 57            }
 058            return await Task.FromException<InstanceModel>(new NonRunnableProjectException(projectId));
 159        }
 60
 61        public async Task<InstanceModel> CreateInstanceAsync(string projectId, InstanceModel createRequest, bool addToRu
 462        {
 463            logger.LogDebug("Creating instance {InstanceName} of class {ClassName} with fields {Fields} for project {Pro
 664                createRequest.Name, createRequest.ClassName, String.Join(",", createRequest.Fields.Select(field => strin
 465            if (GetProjectEntity(projectId) is RunnableProject runnableProject)
 466            {
 467                Instance? createdInstance = runnableProject.CreateInstance(createRequest.ClassName, createRequest.Name, 
 468                createRequest.Fields.ForEach(fieldModel =>
 269                {
 270                    IField? field = createdInstance!.GetField(fieldModel.Name) ?? throw new UnknownEntityException("Fiel
 271                    FieldValueMapper.SetFieldValue(field, fieldModel.FieldValue);
 672                });
 473                return await Task.FromResult(InstanceMapper.ToDto(createdInstance!));
 74            }
 075            return await Task.FromException<InstanceModel>(new NonRunnableProjectException(projectId));
 476        }
 77
 78        public async ValueTask DeleteInstanceAsync(string projectId, string instanceName)
 079        {
 080            logger.LogDebug("Deleting instance {InstanceName} for project {ProjectId}",
 081                instanceName, projectId);
 082            if (GetProjectEntity(projectId) is RunnableProject runnableProject)
 083            {
 084                runnableProject.RemoveInstance(instanceName);
 085                await ValueTask.CompletedTask;
 086                return;
 87            }
 088            await ValueTask.FromException(new NonRunnableProjectException(projectId));
 089        }
 90
 91        private static List<InstanceModel> FilterInstances(string projectId, List<InstanceModel> allInstances, InstanceP
 892        {
 893            List<InstanceModel> filteredInstances = allInstances;
 894            if (!String.IsNullOrEmpty(search.ClassName))
 195            {
 196                Dictionary<string, bool> classNameMatches = [];
 497                filteredInstances = [.. filteredInstances.Where(instance => FilterInstanceClass(projectId, search.ClassN
 198            }
 899            if (!String.IsNullOrEmpty(search.NameFilter))
 1100            {
 2101                filteredInstances = [.. filteredInstances.Where(instance => instance.Name.Contains(search.NameFilter))];
 1102            }
 8103            return filteredInstances;
 8104        }
 105
 106        private static bool FilterInstanceClass(string projectId, string searchedClassName, InstanceModel instance, ref 
 3107        {
 3108            if (classNameMatches.TryGetValue(instance.ClassName, out bool isClassNameMatching))
 1109            {
 1110                return isClassNameMatching;
 111            }
 2112            Class? clazz = GetClassEntity(projectId, instance.ClassName);
 2113            List<string> classInheritance = [];
 4114            while (clazz != null)
 3115            {
 3116                isClassNameMatching = clazz.Name.Equals(searchedClassName);
 3117                classInheritance.Add(clazz.Name);
 3118                if (isClassNameMatching)
 1119                {
 1120                    break;
 121                }
 2122                clazz = clazz.BaseClass;
 2123            }
 12124            foreach (string className in classInheritance)
 3125            {
 3126                classNameMatches[className] = isClassNameMatching;
 3127            }
 2128            return isClassNameMatching;
 3129        }
 130    }
 131}