private async Task <ActionResult> PutFormData(string org, string app, Instance instance, Guid dataGuid, string dataType) { int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId); string classRef = _appResourcesService.GetClassRefForLogicDataType(dataType); Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]); ModelDeserializer deserializer = new ModelDeserializer(_logger, _altinnApp.GetAppModelType(classRef)); object serviceModel = await deserializer.DeserializeAsync(Request.Body, Request.ContentType); if (!string.IsNullOrEmpty(deserializer.Error)) { return(BadRequest(deserializer.Error)); } if (serviceModel == null) { return(BadRequest("No data found in content")); } string serviceModelJsonString = JsonSerializer.Serialize(serviceModel); bool changedByCalculation = false; try { changedByCalculation = await _altinnApp.RunProcessDataWrite(instance, dataGuid, serviceModel); } catch (NotImplementedException) { // Trigger application business logic the old way. DEPRICATED changedByCalculation = await _altinnApp.RunCalculation(serviceModel); } await UpdatePresentationTextsOnInstance(instance, dataType, serviceModel); await UpdateDataValuesOnInstance(instance, dataType, serviceModel); // Save Formdata to database DataElement updatedDataElement = await _dataService.UpdateData( serviceModel, instanceGuid, _altinnApp.GetAppModelType(classRef), org, app, instanceOwnerPartyId, dataGuid); SelfLinkHelper.SetDataAppSelfLinks(instanceOwnerPartyId, instanceGuid, updatedDataElement, Request); string dataUrl = updatedDataElement.SelfLinks.Apps; if (changedByCalculation) { string updatedServiceModelString = JsonSerializer.Serialize(serviceModel); CalculationResult calculationResult = new CalculationResult(updatedDataElement); try { Dictionary <string, object> changedFields = JsonHelper.FindChangedFields(serviceModelJsonString, updatedServiceModelString); calculationResult.ChangedFields = changedFields; } catch (Exception e) { _logger.LogError(e, "Unable to determine changed fields"); } return(StatusCode((int)HttpStatusCode.SeeOther, calculationResult)); } return(Created(dataUrl, updatedDataElement)); }