| | | 1 | | using pva.SuperV.Api.Exceptions; |
| | | 2 | | using pva.SuperV.Engine; |
| | | 3 | | using pva.SuperV.Engine.Exceptions; |
| | | 4 | | using pva.SuperV.Engine.FieldFormatters; |
| | | 5 | | using pva.SuperV.Model; |
| | | 6 | | using pva.SuperV.Model.FieldDefinitions; |
| | | 7 | | using pva.SuperV.Model.Services; |
| | | 8 | | |
| | | 9 | | namespace pva.SuperV.Api.Services.FieldDefinitions |
| | | 10 | | { |
| | | 11 | | public class FieldDefinitionService : BaseService, IFieldDefinitionService |
| | | 12 | | { |
| | 13 | 13 | | private readonly Dictionary<string, Comparison<FieldDefinitionModel>> sortOptions = new() |
| | 13 | 14 | | { |
| | 34 | 15 | | { "name", new Comparison<FieldDefinitionModel>((a, b) => a.Name.CompareTo(b.Name)) } |
| | 13 | 16 | | }; |
| | | 17 | | |
| | | 18 | | public async Task<List<FieldDefinitionModel>> GetFieldsAsync(string projectId, string className) |
| | 102 | 19 | | => await Task.FromResult(GetClassEntity(projectId, className).FieldDefinitions.Values.Select(field => FieldD |
| | | 20 | | |
| | | 21 | | public async Task<FieldDefinitionModel> GetFieldAsync(string projectId, string className, string fieldName) |
| | 1 | 22 | | { |
| | 1 | 23 | | if (GetClassEntity(projectId, className).FieldDefinitions.TryGetValue(fieldName, out IFieldDefinition? field |
| | 1 | 24 | | { |
| | 1 | 25 | | return await Task.FromResult(FieldDefinitionMapper.ToDto(fieldDefinition)); |
| | | 26 | | } |
| | 0 | 27 | | return await Task.FromException<FieldDefinitionModel>(new UnknownEntityException("Field", fieldName)); |
| | 1 | 28 | | } |
| | | 29 | | |
| | | 30 | | public async Task<PagedSearchResult<FieldDefinitionModel>> SearchFieldsAsync(string projectId, string className, |
| | 8 | 31 | | { |
| | 8 | 32 | | List<FieldDefinitionModel> allFieldDefinitions = await GetFieldsAsync(projectId, className); |
| | 8 | 33 | | List<FieldDefinitionModel> fieldDefinitions = FilterFieldDefinitions(allFieldDefinitions, search); |
| | 8 | 34 | | fieldDefinitions = SortResult(fieldDefinitions, search.SortOption, sortOptions); |
| | 7 | 35 | | return CreateResult(search, allFieldDefinitions, fieldDefinitions); |
| | 7 | 36 | | } |
| | | 37 | | |
| | | 38 | | private static List<FieldDefinitionModel> FilterFieldDefinitions(List<FieldDefinitionModel> allFieldDefinitions, |
| | 8 | 39 | | { |
| | 8 | 40 | | List<FieldDefinitionModel> filteredClasses = allFieldDefinitions; |
| | 8 | 41 | | if (!String.IsNullOrEmpty(search.NameFilter)) |
| | 1 | 42 | | { |
| | 11 | 43 | | filteredClasses = [.. filteredClasses.Where(fieldDefinition => fieldDefinition.Name.Contains(search.Name |
| | 1 | 44 | | } |
| | 8 | 45 | | return filteredClasses; |
| | 8 | 46 | | } |
| | | 47 | | |
| | | 48 | | |
| | | 49 | | public async Task<List<FieldDefinitionModel>> CreateFieldsAsync(string projectId, string className, List<FieldDe |
| | 4 | 50 | | { |
| | 4 | 51 | | if (GetProjectEntity(projectId) is WipProject wipProject) |
| | 4 | 52 | | { |
| | 4 | 53 | | List<FieldDefinitionModel> createdFieldDefinitions = []; |
| | 4 | 54 | | Class clazz = GetClassEntity(wipProject, className); |
| | | 55 | | try |
| | 4 | 56 | | { |
| | 4 | 57 | | createRequests.ForEach(fieldDefinition => |
| | 33 | 58 | | { |
| | 33 | 59 | | FieldFormatter? fieldFormatter = null; |
| | 33 | 60 | | if (fieldDefinition.ValueFormatter is not null) |
| | 3 | 61 | | { |
| | 3 | 62 | | fieldFormatter = wipProject.GetFormatter(fieldDefinition.ValueFormatter); |
| | 3 | 63 | | } |
| | 33 | 64 | | createdFieldDefinitions.Add(FieldDefinitionMapper.ToDto(clazz.AddField(FieldDefinitionMapper.Fro |
| | 37 | 65 | | }); |
| | 4 | 66 | | return await Task.FromResult(createdFieldDefinitions); |
| | | 67 | | } |
| | 0 | 68 | | catch (SuperVException e) |
| | 0 | 69 | | { |
| | | 70 | | // If exception while creatig one of the fields, remove all the already created fields. |
| | | 71 | | try |
| | 0 | 72 | | { |
| | 0 | 73 | | createdFieldDefinitions.ForEach(fieldDefinition => |
| | 0 | 74 | | { |
| | 0 | 75 | | clazz.RemoveField(fieldDefinition.Name); |
| | 0 | 76 | | }); |
| | 0 | 77 | | } |
| | 0 | 78 | | catch (SuperVException) |
| | 0 | 79 | | { |
| | | 80 | | // Ignore execption while deleting |
| | 0 | 81 | | } |
| | 0 | 82 | | return await Task.FromException<List<FieldDefinitionModel>>(e); |
| | | 83 | | } |
| | 0 | 84 | | } |
| | 0 | 85 | | return await Task.FromException<List<FieldDefinitionModel>>(new NonWipProjectException(projectId)); |
| | 4 | 86 | | } |
| | | 87 | | |
| | | 88 | | public async Task<FieldDefinitionModel> UpdateFieldAsync(string projectId, string className, string fieldName, F |
| | 3 | 89 | | { |
| | 3 | 90 | | if (GetProjectEntity(projectId) is WipProject wipProject) |
| | 3 | 91 | | { |
| | 3 | 92 | | _ = GetClassEntity(wipProject, className); |
| | 3 | 93 | | if (updateRequest.Name == null || updateRequest.Name.Equals(fieldName)) |
| | 2 | 94 | | { |
| | 2 | 95 | | IFieldDefinition fieldDefinitionUpdate = FieldDefinitionMapper.FromDto(updateRequest); |
| | 2 | 96 | | return await Task.FromResult(FieldDefinitionMapper.ToDto(wipProject.UpdateField(className, fieldName |
| | | 97 | | } |
| | 1 | 98 | | return await Task.FromException<FieldDefinitionModel>(new EntityPropertyNotChangeableException("field", |
| | | 99 | | } |
| | 0 | 100 | | return await Task.FromException<FieldDefinitionModel>(new NonWipProjectException(projectId)); |
| | 1 | 101 | | } |
| | | 102 | | |
| | | 103 | | public async ValueTask DeleteFieldAsync(string projectId, string className, string fieldName) |
| | 1 | 104 | | { |
| | 1 | 105 | | if (GetProjectEntity(projectId) is WipProject wipProject) |
| | 1 | 106 | | { |
| | 1 | 107 | | GetClassEntity(wipProject, className).RemoveField(fieldName); |
| | 1 | 108 | | await ValueTask.CompletedTask; |
| | 1 | 109 | | return; |
| | | 110 | | } |
| | 0 | 111 | | await ValueTask.FromException(new NonWipProjectException(projectId)); |
| | 1 | 112 | | } |
| | | 113 | | } |
| | | 114 | | } |