/// <summary> /// Mappt Elastic-Daten auf ein Auftragsdetail, somit werden die zum Zeitpunkt der Bestellung aufgenommenen Index-Daten /// temporär überschrieben /// Damit das Admin-Backend statt "nicht-sichtbar" die korrekten, echten Daten sehen /// </summary> /// <param name="snapshot"></param> /// <param name="item"></param> public static void ApplySnapshotToDetailItem(OrderingIndexSnapshot snapshot, OrderingFlatItem item) { foreach (var snapshotProperty in typeof(OrderingIndexSnapshot).GetProperties()) { try { var itemProperty = typeof(OrderingFlatItem).GetProperty(snapshotProperty.Name); if (itemProperty == null || itemProperty.PropertyType != snapshotProperty.PropertyType) { continue; } itemProperty.SetValue(item, snapshotProperty.GetValue(snapshot)); } catch (Exception ex) { Log.Warning(ex, "Error when applying indexsnapshot to detail item"); } } // Ausnahmen, die sich nicht automatisch mappen lassen item.BehaeltnisNummer = snapshot.BehaeltnisCode; }
public void When_Applying_An_ElasticSnapshot_To_Detailitem_It_Should_Replace_Unknown_Texts_With_Real_Data() { // arrange var detailItem = new OrderingFlatItem(); var snapshot = new OrderingIndexSnapshot(); foreach (var prop in detailItem.GetType().GetProperties().Where(p => p.PropertyType == typeof(string))) { var isElasticProperty = typeof(OrderingIndexSnapshot).GetProperty(prop.Name) != null; if (!isElasticProperty) { continue; } prop.SetValue(detailItem, "HIDDEN"); } detailItem.BehaeltnisNummer = "HIDDEN"; SetAllStringPropertiesWithThisText(snapshot, "SECRET"); // act OrderHelper.ApplySnapshotToDetailItem(snapshot, detailItem); // assert foreach (var prop in typeof(OrderingFlatItem) .GetProperties() .Where(p => p.PropertyType == typeof(string))) { var value = prop.GetValue(detailItem) as string; if (value == null || string.IsNullOrEmpty(value)) { continue; } value.Should().Be("SECRET", $"Field {prop.Name} must have the value of the snapshot"); } }
private async Task <IHttpActionResult> UpdateOrderItem([FromBody] OrderingFlatItem flatItem, ModulFunktionsblock modulFunktionsblock) { var existingOrdering = await orderManagerClient.GetOrdering(flatItem.OrderId); if (existingOrdering == null) { return(BadRequest("Ordering does not exist in DB")); } var existingItem = existingOrdering.Items.FirstOrDefault(i => i.Id == flatItem.ItemId); if (existingItem == null) { return(BadRequest("OrderItem does not exist in DB")); } var updateOrderingData = new UpdateOrderingData(); var updateOrderItemData = new UpdateOrderItemData(); // map flatitem back to to ordering & orderitem foreach (var field in GetOrderingFieldsInternal(modulFunktionsblock)) { var flatItemProperty = typeof(OrderingFlatItem).GetProperty(field.Name); if (flatItemProperty == null) { throw new ArgumentOutOfRangeException(field.Name); } var newVal = flatItemProperty.GetValue(flatItem); var originAttribute = flatItemProperty.GetCustomAttributes(true).OfType <OriginAttribute>().FirstOrDefault(); if (string.IsNullOrWhiteSpace(originAttribute?.Column) || string.IsNullOrWhiteSpace(originAttribute.Table)) { continue; // field is not updateable, because it is missing the origin attribute } switch (originAttribute.Table) { case nameof(Ordering): EnsureUpdateIsGranted(newVal, existingOrdering, originAttribute.Column, field.IsReadonly); Reflective.SetValue(updateOrderingData, originAttribute.Column, newVal); break; case nameof(OrderItem): EnsureUpdateIsGranted(newVal, existingItem, originAttribute.Column, field.IsReadonly); Reflective.SetValue(updateOrderItemData, originAttribute.Column, newVal); break; default: throw new ArgumentOutOfRangeException(nameof(originAttribute.Table), $"Unknown table: {originAttribute.Table}"); } } if (flatItem.Status == (int)OrderStatesInternal.Ausgeliehen && !existingItem.Ausleihdauer.Equals(flatItem.Ausleihdauer)) { var user = ControllerHelper.UserDataAccess.GetUser(ControllerHelper.GetCurrentUserId()); updateOrderItemData.InternalComment = updateOrderItemData.InternalComment.Prepend( $"Erwartetes Rückgabedatum von {existingItem.Ausgabedatum.Value.AddDays(existingItem.Ausleihdauer):dd.MM.yyyy} " + $"auf {flatItem.Ausgabedatum.Value.AddDays(flatItem.Ausleihdauer):dd.MM.yyyy} angepasst," + $" {DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")}, {user.FirstName} {user.FamilyName}"); } var data = new UpdateOrderDetailData { OrderItem = updateOrderItemData, Ordering = updateOrderingData }; await orderManagerClient.UpdateOrderDetail(data); return(StatusCode(HttpStatusCode.NoContent)); }
public async Task <IHttpActionResult> EinsichtsgesuchUpdateOrderItem([FromBody] OrderingFlatItem flatItem) { return(await UpdateOrderItem(flatItem, ModulFunktionsblock.AuftragsuebersichEinsichtsgesuch)); }
private async Task <IHttpActionResult> UpdateOrderItem([FromBody] OrderingFlatItem flatItem, ModulFunktionsblock modulFunktionsblock) { var existingOrdering = await orderManagerClient.GetOrdering(flatItem.OrderId); if (existingOrdering == null) { return(BadRequest("Ordering does not exist in DB")); } var existingItem = existingOrdering.Items.FirstOrDefault(i => i.Id == flatItem.ItemId); if (existingItem == null) { return(BadRequest("OrderItem does not exist in DB")); } var updateOrderingData = new UpdateOrderingData(); var updateOrderItemData = new UpdateOrderItemData(); // map flatitem back to to ordering & orderitem foreach (var field in GetOrderingFieldsInternal(modulFunktionsblock)) { var flatItemProperty = typeof(OrderingFlatItem).GetProperty(field.Name); if (flatItemProperty == null) { throw new ArgumentOutOfRangeException(field.Name); } var newVal = flatItemProperty.GetValue(flatItem); var originAttribute = flatItemProperty.GetCustomAttributes(true).OfType <OriginAttribute>().FirstOrDefault(); if (string.IsNullOrWhiteSpace(originAttribute?.Column) || string.IsNullOrWhiteSpace(originAttribute.Table)) { continue; // field is not updateable, because it is missing the origin attribute } switch (originAttribute.Table) { case nameof(Ordering): EnsureUpdateIsGranted(newVal, existingOrdering, originAttribute.Column, field.IsReadonly); Reflective.SetValue(updateOrderingData, originAttribute.Column, newVal); break; case nameof(OrderItem): EnsureUpdateIsGranted(newVal, existingItem, originAttribute.Column, field.IsReadonly); Reflective.SetValue(updateOrderItemData, originAttribute.Column, newVal); break; default: throw new ArgumentOutOfRangeException(nameof(originAttribute.Table), $"Unknown table: {originAttribute.Table}"); } } var data = new UpdateOrderDetailData { OrderItem = updateOrderItemData, Ordering = updateOrderingData }; await orderManagerClient.UpdateOrderDetail(data); return(StatusCode(HttpStatusCode.NoContent)); }