コード例 #1
0
        private async Task <ActionResult> CreateAppModelData(
            string org,
            string app,
            Instance instance,
            string dataType)
        {
            Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]);

            object appModel;

            string classRef = _appResourcesService.GetClassRefForLogicDataType(dataType);

            if (Request.ContentType == null)
            {
                appModel = _altinnApp.CreateNewAppModel(classRef);
            }
            else
            {
                ModelDeserializer deserializer = new ModelDeserializer(_logger, _altinnApp.GetAppModelType(classRef));
                appModel = await deserializer.DeserializeAsync(Request.Body, Request.ContentType);

                if (!string.IsNullOrEmpty(deserializer.Error))
                {
                    return(BadRequest(deserializer.Error));
                }
            }

            // runs prefill from repo configuration if config exists
            await _prefillService.PrefillDataModel(instance.InstanceOwner.PartyId, dataType, appModel);

            // send events to trigger application business logic
            await _altinnApp.RunDataCreation(instance, appModel);

            Dictionary <string, string> updatedValues =
                DataHelper.GetUpdatedDataValues(
                    _appResourcesService.GetApplication().PresentationFields,
                    instance.PresentationTexts,
                    dataType,
                    appModel);

            if (updatedValues.Count > 0)
            {
                await _instanceService.UpdatePresentationTexts(
                    int.Parse(instance.InstanceOwner.PartyId),
                    Guid.Parse(instance.Id.Split("/")[1]),
                    new PresentationTexts { Texts = updatedValues });
            }

            int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId);

            DataElement dataElement = await _dataService.InsertFormData(appModel, instanceGuid, _altinnApp.GetAppModelType(classRef), org, app, instanceOwnerPartyId, dataType);

            SelfLinkHelper.SetDataAppSelfLinks(instanceOwnerPartyId, instanceGuid, dataElement, Request);

            return(Created(dataElement.SelfLinks.Apps, dataElement));
        }
コード例 #2
0
        public async Task <ActionResult> Put([FromQuery] string dataType)
        {
            string classRef = _appResourcesService.GetClassRefForLogicDataType(dataType);

            if (string.IsNullOrEmpty(classRef))
            {
                return(BadRequest($"Invalid dataType {dataType} provided. Please provide a valid dataType as query parameter."));
            }

            ModelDeserializer deserializer = new ModelDeserializer(_logger, _altinnApp.GetAppModelType(classRef));
            object            appModel     = await deserializer.DeserializeAsync(Request.Body, Request.ContentType);

            if (!string.IsNullOrEmpty(deserializer.Error))
            {
                return(BadRequest(deserializer.Error));
            }

            if (appModel == null)
            {
                return(BadRequest("No data found in content"));
            }

            await _altinnApp.RunCalculation(appModel);

            return(Ok(appModel));
        }
コード例 #3
0
        private async Task StorePrefillParts(Instance instance, Application appInfo, List <RequestPart> parts)
        {
            Guid   instanceGuid         = Guid.Parse(instance.Id.Split("/")[1]);
            int    instanceOwnerIdAsInt = int.Parse(instance.InstanceOwner.PartyId);
            string org = instance.Org;
            string app = instance.AppId.Split("/")[1];

            foreach (RequestPart part in parts)
            {
                DataType dataType = appInfo.DataTypes.Find(d => d.Id == part.Name);

                DataElement dataElement;
                if (dataType.AppLogic != null)
                {
                    _logger.LogInformation($"Storing part {part.Name}");

                    Type type;
                    try
                    {
                        type = _altinnApp.GetAppModelType(dataType.AppLogic.ClassRef);
                    }
                    catch (Exception altinnAppException)
                    {
                        throw new ServiceException(HttpStatusCode.InternalServerError, $"App.GetAppModelType failed: {altinnAppException.Message}", altinnAppException);
                    }

                    ModelDeserializer deserializer = new ModelDeserializer(_logger, type);
                    object            data         = await deserializer.DeserializeAsync(part.Stream, part.ContentType);

                    if (!string.IsNullOrEmpty(deserializer.Error))
                    {
                        throw new InvalidOperationException(deserializer.Error);
                    }

                    await _prefillService.PrefillDataModel(instance.InstanceOwner.PartyId, part.Name, data);

                    await _altinnApp.RunDataCreation(instance, data);

                    dataElement = await _dataService.InsertFormData(
                        data,
                        instanceGuid,
                        type,
                        org,
                        app,
                        instanceOwnerIdAsInt,
                        part.Name);
                }
                else
                {
                    dataElement = await _dataService.InsertBinaryData(instance.Id, part.Name, part.ContentType, part.FileName, part.Stream);
                }

                if (dataElement == null)
                {
                    throw new ServiceException(HttpStatusCode.InternalServerError, $"Data service did not return a valid instance metadata when attempt to store data element {part.Name}");
                }
            }
        }
コード例 #4
0
        public async Task <ActionResult> Post(
            [FromRoute] string org,
            [FromRoute] string app,
            [FromQuery] string dataType)
        {
            if (string.IsNullOrEmpty(dataType))
            {
                return(BadRequest($"Invalid dataType {dataType} provided. Please provide a valid dataType as query parameter."));
            }

            string classRef = _appResourcesService.GetClassRefForLogicDataType(dataType);

            if (string.IsNullOrEmpty(classRef))
            {
                return(BadRequest($"Invalid dataType {dataType} provided. Please provide a valid dataType as query parameter."));
            }

            if (GetPartyHeader(HttpContext).Count > 1)
            {
                return(BadRequest($"Invalid party. Only one allowed"));
            }

            InstanceOwner owner = await GetInstanceOwner(HttpContext);

            if (string.IsNullOrEmpty(owner.PartyId))
            {
                return(StatusCode((int)HttpStatusCode.Forbidden));
            }

            EnforcementResult enforcementResult = await AuthorizeAction(org, app, Convert.ToInt32(owner.PartyId), "read");

            if (!enforcementResult.Authorized)
            {
                return(Forbidden(enforcementResult));
            }

            ModelDeserializer deserializer = new ModelDeserializer(_logger, _altinnApp.GetAppModelType(classRef));
            object            appModel     = await deserializer.DeserializeAsync(Request.Body, Request.ContentType);

            if (!string.IsNullOrEmpty(deserializer.Error))
            {
                return(BadRequest(deserializer.Error));
            }

            // runs prefill from repo configuration if config exists
            await _prefillService.PrefillDataModel(owner.PartyId, dataType, appModel);

            Instance virutalInstance = new Instance()
            {
                InstanceOwner = owner
            };
            await _altinnApp.RunProcessDataRead(virutalInstance, null, appModel);

            return(Ok(appModel));
        }
コード例 #5
0
        private async Task StorePrefillParts(Instance instance, Application appInfo, List <RequestPart> parts)
        {
            Guid        instanceGuid         = Guid.Parse(instance.Id.Split("/")[1]);
            int         instanceOwnerIdAsInt = int.Parse(instance.InstanceOwner.PartyId);
            DataElement dataElement          = null;
            string      org = instance.Org;
            string      app = instance.AppId.Split("/")[1];

            foreach (RequestPart part in parts)
            {
                DataType dataType = appInfo.DataTypes.Find(d => d.Id == part.Name);

                if (dataType.AppLogic != null)
                {
                    _logger.LogInformation($"Storing part {part.Name}");

                    Type type;
                    try
                    {
                        type = _altinnApp.GetAppModelType(dataType.AppLogic.ClassRef);
                    }
                    catch (Exception altinnAppException)
                    {
                        throw new ApplicationException($"App.GetAppModelType failed: {altinnAppException.Message}");
                    }

                    object data = DataController.ParseFormDataAndDeserialize(type, part.ContentType, part.Stream, out string errorText);

                    if (!string.IsNullOrEmpty(errorText))
                    {
                        throw new InvalidOperationException(errorText);
                    }

                    dataElement = await _dataService.InsertFormData(
                        data,
                        instanceGuid,
                        type,
                        org,
                        app,
                        instanceOwnerIdAsInt,
                        part.Name);
                }
                else
                {
                    dataElement = await _dataService.InsertBinaryData(instance.Id, part.Name, part.ContentType, part.FileName, part.Stream);
                }

                if (dataElement == null)
                {
                    throw new InvalidOperationException($"Dataservice did not return a valid instance metadata when attempt to store data element {part.Name}");
                }
            }
        }
コード例 #6
0
        private async Task <ActionResult> CreateAppModelData(
            string org,
            string app,
            Instance instance,
            string dataType)
        {
            Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]);

            object appModel;


            string classRef = _appResourcesService.GetClassRefForLogicDataType(dataType);

            if (Request.ContentType == null)
            {
                appModel = _altinnApp.CreateNewAppModel(classRef);
            }
            else
            {
                appModel = ParseContentAndDeserializeServiceModel(_altinnApp.GetAppModelType(classRef), out ActionResult contentError);
                if (contentError != null)
                {
                    return(contentError);
                }
            }

            // send events to trigger application business logic
            await _altinnApp.RunAppEvent(AppEventType.AppModelCreation, appModel);

            int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId);

            DataElement dataElement = await _dataService.InsertFormData(appModel, instanceGuid, _altinnApp.GetAppModelType(classRef), org, app, instanceOwnerPartyId, dataType);

            SelfLinkHelper.SetDataAppSelfLinks(instanceOwnerPartyId, instanceGuid, dataElement, Request);

            return(Created(dataElement.SelfLinks.Apps, dataElement));
        }
コード例 #7
0
        public async Task <ActionResult <List <string> > > GetPageOrder(
            [FromRoute] string org,
            [FromRoute] string app,
            [FromRoute] int instanceOwnerPartyId,
            [FromRoute] Guid instanceGuid,
            [FromQuery] string layoutSetId,
            [FromQuery] string currentPage,
            [FromQuery] string dataTypeId,
            [FromBody] dynamic formData)
        {
            if (string.IsNullOrEmpty(dataTypeId))
            {
                return(BadRequest("Query parameter `dataTypeId` must be defined"));
            }

            string classRef = _resources.GetClassRefForLogicDataType(dataTypeId);

            object data = JsonConvert.DeserializeObject(formData.ToString(), _altinnApp.GetAppModelType(classRef));

            return(await _altinnApp.GetPageOrder(org, app, instanceOwnerPartyId, instanceGuid, layoutSetId, currentPage, dataTypeId, data));
        }
コード例 #8
0
        public async Task <List <ValidationIssue> > ValidateDataElement(Instance instance, DataType dataType, DataElement dataElement)
        {
            _logger.LogInformation($"Validation of data element {dataElement.Id} of instance {instance.Id}");

            // Todo. Figure out where to get this from
            Dictionary <string, Dictionary <string, string> > serviceText = new Dictionary <string, Dictionary <string, string> >();

            List <ValidationIssue> messages = new List <ValidationIssue>();

            if (dataElement.ContentType == null)
            {
                ValidationIssue message = new ValidationIssue
                {
                    InstanceId    = instance.Id,
                    Code          = ValidationIssueCodes.DataElementCodes.MissingContentType,
                    DataElementId = dataElement.Id,
                    Severity      = ValidationIssueSeverity.Error,
                    Description   = AppTextHelper.GetAppText(
                        ValidationIssueCodes.DataElementCodes.MissingContentType, serviceText, null, "nb")
                };
                messages.Add(message);
            }
            else
            {
                string contentTypeWithoutEncoding = dataElement.ContentType.Split(";")[0];

                if (dataType.AllowedContentTypes != null && dataType.AllowedContentTypes.Count > 0 && dataType.AllowedContentTypes.All(ct => !ct.Equals(contentTypeWithoutEncoding, StringComparison.OrdinalIgnoreCase)))
                {
                    ValidationIssue message = new ValidationIssue
                    {
                        InstanceId    = instance.Id,
                        DataElementId = dataElement.Id,
                        Code          = ValidationIssueCodes.DataElementCodes.ContentTypeNotAllowed,
                        Severity      = ValidationIssueSeverity.Error,
                        Description   = AppTextHelper.GetAppText(
                            ValidationIssueCodes.DataElementCodes.ContentTypeNotAllowed, serviceText, null, "nb"),
                        Field = dataType.Id
                    };
                    messages.Add(message);
                }
            }

            if (dataType.MaxSize.HasValue && dataType.MaxSize > 0 && (long)dataType.MaxSize * 1024 * 1024 < dataElement.Size)
            {
                ValidationIssue message = new ValidationIssue
                {
                    InstanceId    = instance.Id,
                    DataElementId = dataElement.Id,
                    Code          = ValidationIssueCodes.DataElementCodes.DataElementTooLarge,
                    Severity      = ValidationIssueSeverity.Error,
                    Description   = AppTextHelper.GetAppText(
                        ValidationIssueCodes.DataElementCodes.DataElementTooLarge, serviceText, null, "nb"),
                    Field = dataType.Id
                };
                messages.Add(message);
            }

            if (dataType.AppLogic != null)
            {
                Type    modelType            = _altinnApp.GetAppModelType(dataType.AppLogic.ClassRef);
                Guid    instanceGuid         = Guid.Parse(instance.Id.Split("/")[1]);
                string  app                  = instance.AppId.Split("/")[1];
                int     instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId);
                dynamic data                 = await _dataService.GetFormData(instanceGuid, modelType, instance.Org, app, instanceOwnerPartyId, Guid.Parse(dataElement.Id));

                ModelStateDictionary validationResults = new ModelStateDictionary();
                var actionContext = new ActionContext(
                    _httpContextAccessor.HttpContext,
                    new Microsoft.AspNetCore.Routing.RouteData(),
                    new ActionDescriptor(),
                    validationResults);

                ValidationStateDictionary validationState = new ValidationStateDictionary();
                _objectModelValidator.Validate(actionContext, validationState, null, data);
                await _altinnApp.RunDataValidation(data, validationResults);

                if (!validationResults.IsValid)
                {
                    messages.AddRange(MapModelStateToIssueList(actionContext.ModelState, instance, dataElement.Id, serviceText));
                }
            }

            return(messages);
        }
コード例 #9
0
        public async Task <List <ValidationIssue> > ValidateDataElement(Instance instance, DataType dataType, DataElement dataElement)
        {
            _logger.LogInformation($"Validation of data element {dataElement.Id} of instance {instance.Id}");

            // Todo. Figure out where to get this from
            Dictionary <string, Dictionary <string, string> > serviceText = new Dictionary <string, Dictionary <string, string> >();

            List <ValidationIssue> messages = new List <ValidationIssue>();

            if (dataElement.ContentType == null)
            {
                ValidationIssue message = new ValidationIssue
                {
                    InstanceId    = instance.Id,
                    Code          = ValidationIssueCodes.DataElementCodes.MissingContentType,
                    DataElementId = dataElement.Id,
                    Severity      = ValidationIssueSeverity.Error,
                    Description   = ServiceTextHelper.GetServiceText(
                        ValidationIssueCodes.DataElementCodes.MissingContentType, serviceText, null, "nb")
                };
                messages.Add(message);
            }
            else
            {
                string contentTypeWithoutEncoding = dataElement.ContentType.Split(";")[0];

                if (dataType.AllowedContentTypes.All(ct => !ct.Equals(contentTypeWithoutEncoding, StringComparison.OrdinalIgnoreCase)))
                {
                    ValidationIssue message = new ValidationIssue
                    {
                        InstanceId    = instance.Id,
                        DataElementId = dataElement.Id,
                        Code          = ValidationIssueCodes.DataElementCodes.ContentTypeNotAllowed,
                        Severity      = ValidationIssueSeverity.Error,
                        Description   = ServiceTextHelper.GetServiceText(
                            ValidationIssueCodes.DataElementCodes.ContentTypeNotAllowed, serviceText, null, "nb")
                    };
                    messages.Add(message);
                }
            }

            if (dataType.MaxSize.HasValue && dataType.MaxSize > 0 && (long)dataType.MaxSize * 1024 * 1024 < dataElement.Size)
            {
                ValidationIssue message = new ValidationIssue
                {
                    InstanceId    = instance.Id,
                    DataElementId = dataElement.Id,
                    Code          = ValidationIssueCodes.DataElementCodes.DataElementTooLarge,
                    Severity      = ValidationIssueSeverity.Error,
                    Description   = ServiceTextHelper.GetServiceText(
                        ValidationIssueCodes.DataElementCodes.DataElementTooLarge, serviceText, null, "nb")
                };
                messages.Add(message);
            }

            if (dataType.AppLogic != null)
            {
                Type    modelType            = _altinnApp.GetAppModelType(dataType.AppLogic.ClassRef);
                Guid    instanceGuid         = Guid.Parse(instance.Id.Split("/")[1]);
                string  app                  = instance.AppId.Split("/")[1];
                int     instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId);
                dynamic data                 = _dataService.GetFormData(instanceGuid, modelType, instance.Org, app, instanceOwnerPartyId, Guid.Parse(dataElement.Id));

                var context = new ValidationContext(data);
                List <System.ComponentModel.DataAnnotations.ValidationResult> validationResults = new List <System.ComponentModel.DataAnnotations.ValidationResult>();
                bool isValid = await _altinnApp.RunValidation(data.Result, modelType, validationResults);

                isValid = Validator.TryValidateObject(data, context, validationResults, true) && isValid;

                if (!isValid)
                {
                    messages.AddRange(MapModelStateToIssueList(instance, validationResults, dataElement.Id, dataElement.DataType, serviceText));
                }
            }

            return(messages);
        }