protected bool IsEinsichtsbewilligungNotwendig(ElasticArchiveRecord record, UserAccess access, bool hasBewilligungsDatum)
 {
     return(record.HasCustomProperty("zugänglichkeitGemässBga") &&
            record.CustomFields.zugänglichkeitGemässBga == "In Schutzfrist" &&
            !access.HasAnyTokenFor(record.PrimaryDataDownloadAccessTokens) &&
            !hasBewilligungsDatum);
 }
        private Auftrag GetAuftragForOrderItemWithVeId(Ordering ordering, OrderItem orderItem)
        {
            var bestellterRecord = GetElasticArchiveRecord(orderItem.VeId.ToString());
            ElasticArchiveRecord auszuhebenderRecord = null;
            var besteller = GetPerson(ordering.UserId);

            if (ordering.Type == OrderType.Digitalisierungsauftrag)
            {
                var dossierId = bestellterRecord.GetAuszuhebendeArchiveRecordId();
                if (dossierId != null)
                {
                    auszuhebenderRecord = GetElasticArchiveRecord(dossierId);
                }
            }
            else
            {
                auszuhebenderRecord = bestellterRecord;
            }

            var auftrag = new Auftrag(orderItem,
                                      ordering,
                                      InElasticIndexierteVe.FromElasticArchiveRecord(bestellterRecord),
                                      InElasticIndexierteVe.FromElasticArchiveRecord(auszuhebenderRecord),
                                      besteller);

            return(auftrag);
        }
        public async Task Eine_Lesesaalausleihen_eines_BAR_Benutzers_wird_nicht_automatisch_freigegeben_wenn_die_DownloadTokens_nicht_BAR_enthalten()
        {
            var currentUser = new User {
                Id = "current"
            };
            var besteller = new User
            {
                Id = "besteller", Access = new UserAccess("besteller", AccessRoles.RoleBAR, "ALLOW", new string[0], false, "de")
            };

            var item = new OrderItem {
                OrderId = 1, Id = 1001, VeId = 200, Status = OrderStatesInternal.ImBestellkorb
            };
            var ordering = new Ordering {
                Id = 1, UserId = "besteller", Type = OrderType.Lesesaalausleihen, OrderDate = DateTime.Now
            };

            var ear = new ElasticArchiveRecord
            {
                PrimaryDataDownloadAccessTokens = new List <string>(),
                ArchiveRecordId = item.VeId.Value.ToString()
            };

            await PerformTest(currentUser, besteller, ordering, item, ear, p => p.Bestellen());

            item.Status.Should().Be(OrderStatesInternal.FreigabePruefen);
            item.ApproveStatus.Should().Be(ApproveStatus.NichtGeprueft);
        }
示例#4
0
        /// <summary>
        ///     Diese Methode wurde nach den genauen schriftlichen Vorgaben des BARs implementiert.
        ///     Diese Vorgaben sind im Anwendungshandbuch enthalten und finden sich auch unter dem folgenden Link:
        /// </summary>
        public async Task <CacheRetentionCategory> GetRetentionCategory(ElasticArchiveRecord archiveRecord, string rolePublicClient,
                                                                        IOrderDataAccess orderDataAccess)
        {
            var downloadAccessTokens = archiveRecord.PrimaryDataDownloadAccessTokens;

            if (downloadAccessTokens.Contains(AccessRoles.RoleOe2) || downloadAccessTokens.Exists(t => t.StartsWith("FG_")))
            {
                return(CacheRetentionCategory.UsageCopyPublic);
            }

            if (downloadAccessTokens.Contains("DDS") && archiveRecord.ProtectionEndDate?.Date.Date < DateTime.Now.Date)
            {
                return(CacheRetentionCategory.UsageCopyPublic);
            }

            if (rolePublicClient == AccessRoles.RoleBAR)
            {
                return(CacheRetentionCategory.UsageCopyBarOrAS);
            }

            if (int.TryParse(archiveRecord.ArchiveRecordId, out var veId) && await orderDataAccess.HasEinsichtsbewilligung(veId))
            {
                return(CacheRetentionCategory.UsageCopyEB);
            }

            if (rolePublicClient == AccessRoles.RoleAS)
            {
                return(CacheRetentionCategory.UsageCopyBarOrAS);
            }

            return(CacheRetentionCategory.UsageCopyAB);
        }
        public async Task Ein_Digitalisierungsauftrag_eines_BAR_Benutzers_erhaelt_die_Digitalisierungskategorie_Intern()
        {
            var currentUser = new User {
                Id = "current"
            };
            var besteller = new User
            {
                Id = "besteller", Access = new UserAccess("besteller", AccessRoles.RoleBAR, "ALLOW", new string [0], false, "de")
            };

            var item = new OrderItem {
                OrderId = 1, Id = 1001, VeId = 200, Status = OrderStatesInternal.ImBestellkorb
            };
            var ordering = new Ordering {
                Id = 1, UserId = "besteller", Type = OrderType.Digitalisierungsauftrag, OrderDate = DateTime.Now
            };

            var ear = new ElasticArchiveRecord
            {
                PrimaryDataDownloadAccessTokens = new List <string>(new[] { "BAR" }),
                ArchiveRecordId = item.VeId.Value.ToString()
            };

            await PerformTest(currentUser, besteller, ordering, item, ear, p => p.Bestellen());

            item.DigitalisierungsKategorie.Should().Be(DigitalisierungsKategorie.Intern);
        }
示例#6
0
 /// <summary>
 ///     Falls die Methode true zurückgibt, muss der der Benutzer
 ///     A) wählen das keine Personendaten vorhanden sind oder
 ///     B) ein Grund auswählen
 /// </summary>
 internal static bool CouldNeedAReason(ElasticArchiveRecord record, UserAccess access)
 {
     return(record.HasCustomProperty("zugänglichkeitGemässBga") &&
            access.RolePublicClient == AccessRoles.RoleAS &&
            access.HasAsTokenFor(record.PrimaryDataDownloadAccessTokens) &&
            (record.CustomFields.zugänglichkeitGemässBga == "In Schutzfrist" ||
             record.CustomFields.zugänglichkeitGemässBga == "Prüfung nötig"));
 }
示例#7
0
        private bool CheckUserHasDownloadTokensForVe(UserAccess access, ElasticArchiveRecord record)
        {
            if (record == null)
            {
                return(false);
            }

            return(access.HasAnyTokenFor(record.PrimaryDataDownloadAccessTokens));
        }
        public void Test_IndexManager_Should_Fill_CustomFields_Correctly()
        {
            // Arrange
            var configFile            = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "customFieldsConfig.json");
            var mockSearchIndexAccess = new Mock <ISearchIndexDataAccess>();

            mockSearchIndexAccess.Setup(s => s
                                        .UpdateDocument(It.IsAny <ElasticArchiveRecord>()))
            .Callback(() => Console.WriteLine("Update Document was called"));

            mockSearchIndexAccess.Setup(s => s
                                        .RemoveDocument(It.IsAny <string>()))
            .Callback(() => Console.WriteLine("Remove Document was called"));

            var config        = new CustomFieldsConfiguration(configFile);
            var indexmanager  = new IndexManager(mockSearchIndexAccess.Object, config);
            var archiveRecord = new ElasticArchiveRecord();

            var dataElementFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "dataElements.json");
            var json            = File.ReadAllText(dataElementFile);
            var dataElements    = JsonConvert.DeserializeObject <List <DataElement> >(json);

            // Act
            indexmanager.TransferDataFromPropertyBag(archiveRecord, dataElements);

            // Assert
            Assert.IsNotNull(archiveRecord.CustomFields, "CustomField Property should be filled correctly");

            Assert.Throws <RuntimeBinderException>(() =>
            {
                var test = archiveRecord.CustomFields.Title;
            },
                                                   "Title is not a custom field, so it should not be in the dynamic property");

            Assert.DoesNotThrow(() =>
            {
                var test = archiveRecord.CustomFields.ZugänglichkeitGemässBga;
            },
                                "ZugänglichkeitGemässBga is a custom field (with special chars), and so it should not throw on access");

            Assert.Throws <RuntimeBinderException>(() =>
            {
                var testYear = archiveRecord.CustomFields.DummyElasticdatewithyear;
            },
                                                   "DummyElasticDateWithYear is not available, as there is no data for it.");

            Assert.IsNotNull(archiveRecord.CustomFields.Form);
            Assert.AreEqual("Fotografie", archiveRecord.CustomFields.Form);

            Assert.IsAssignableFrom <List <ElasticHyperlink> >(archiveRecord.CustomFields.DigitaleVersion);
            Assert.AreEqual("https://commons.wikimedia.org/wiki/File:Flugzeug_Grandjean_vor_dem_Aufstieg_-_CH-BAR_-_3236769.tif",
                            archiveRecord.CustomFields.DigitaleVersion[0].Url);
            Assert.AreEqual("E27#1000/721#14093#5489* (Wikimedia Commons)",
                            archiveRecord.CustomFields.DigitaleVersion[0].Text);
        }
        public void Test_CustomFields_Serialization_Working_Correct()
        {
            // Arrange
            var configFile            = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "customFieldsConfig.json");
            var mockSearchIndexAccess = new Mock <ISearchIndexDataAccess>();

            mockSearchIndexAccess.Setup(s => s
                                        .UpdateDocument(It.IsAny <ElasticArchiveRecord>()))
            .Callback(() => Console.WriteLine("Update Document was called"));

            mockSearchIndexAccess.Setup(s => s
                                        .RemoveDocument(It.IsAny <string>()))
            .Callback(() => Console.WriteLine("Remove Document was called"));

            var config        = new CustomFieldsConfiguration(configFile);
            var indexmanager  = new IndexManager(mockSearchIndexAccess.Object, config);
            var archiveRecord = new ElasticArchiveRecord();

            var dataElementFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "dataElements.json");
            var json            = File.ReadAllText(dataElementFile);
            var dataElements    = JsonConvert.DeserializeObject <List <DataElement> >(json);

            // Act
            indexmanager.TransferDataFromPropertyBag(archiveRecord, dataElements);
            var jsonString = JsonConvert.SerializeObject(archiveRecord);
            var record     = JsonConvert.DeserializeObject <ElasticArchiveRecord>(jsonString);

            // Assert
            Assert.IsNotNull(record);

            //  Beim deserialisieren via Elastic hat das dynamic Property ein ExpandoObject
            Assert.IsAssignableFrom <ExpandoObject>(record.CustomFields);

            // - nicht weiter schlimm, wir können es weiterhin als dynamic ansprechen
            Assert.DoesNotThrow(() =>
            {
                var test = record.CustomFields.Form;
                Console.WriteLine(test);
            });

            // - und die properties auslesen
            var form = record.CustomFields.Form;

            Assert.IsNotNull(form);
            Assert.AreEqual("Fotografie", form);

            Assert.IsAssignableFrom <List <dynamic> >(record.CustomFields.DigitaleVersion);
            var hyperlink = record.CustomFields.DigitaleVersion[0];

            Assert.AreEqual("https://commons.wikimedia.org/wiki/File:Flugzeug_Grandjean_vor_dem_Aufstieg_-_CH-BAR_-_3236769.tif",
                            hyperlink.Url);
            Assert.AreEqual("E27#1000/721#14093#5489* (Wikimedia Commons)",
                            hyperlink.Text);
        }
示例#10
0
        public VeFuerKontrollstelle(ElasticArchiveRecord elasticArchiveRecord, int?begruendung) : base(elasticArchiveRecord)
        {
            var idList         = new List <int>();
            var hasBegruendung = begruendung != null && begruendung != 0;

            if (hasBegruendung)
            {
                idList.Add(begruendung.Value);
            }

            Begründung       = new Stammdaten(idList, "Reason");
            HatPersonendaten = hasBegruendung;
        }
        private ElasticArchiveRecord GetSampleArchiveRecord()
        {
            var record = new ElasticArchiveRecord
            {
                CreationPeriod = new ElasticTimePeriod {
                    StartDate = DateTime.Today
                },
                CustomFields = new ExpandoObject()
            };

            record.CustomFields.aktenzeichen = "Ein Beispiel";
            return(record);
        }
        /// <summary>Arranges the Vecteur controller</summary>
        /// <param name="digipoolResult">The result that should be returned from the call to GetDigipool</param>
        /// <param name="archiveRecordResult">The result that should be returned from the Elastic DB. It is the archive record</param>
        private VecteurController ArrangeControllerForGetNextDigitalisierungsauftrag(DigipoolEntry[] digipoolResult,
                                                                                     ElasticArchiveRecord archiveRecordResult)
        {
            var actionClientMock       = Mock.Of <IVecteurActions>();
            var orderManagerMock       = Mock.Of <IPublicOrder>(x => x.GetDigipool(It.IsAny <int>()) == Task.FromResult(digipoolResult));
            var digitizationHelperMock = Mock.Of <IDigitizationHelper>(x =>
                                                                       x.GetDigitalisierungsAuftrag(It.IsAny <string>()) == GetEmptyDigitalisierungsauftrag() &&
                                                                       x.GetManualDigitalisierungsAuftrag(It.IsAny <DigipoolEntry>()) == GetEmptyDigitalisierungsauftrag());
            var busHelper =
                Mock.Of <IMessageBusCallHelper>(x => x.GetElasticArchiveRecord(It.IsAny <string>()) == Task.FromResult(archiveRecordResult));

            return(SetupVecteurController(actionClientMock, orderManagerMock, digitizationHelperMock, busHelper, Mock.Of <IMailHelper>()));
        }
示例#13
0
        private IHttpActionResult CheckStatusAsync(string packageId, ElasticArchiveRecord record, UserAccess access)
        {
            if (string.IsNullOrEmpty(packageId))
            {
                return(BadRequest("VE does not contain any primarydata and/or a valid packageid"));
            }

            if (!CheckUserHasDownloadTokensForVe(access, record))
            {
                return(StatusCode(HttpStatusCode.Forbidden));
            }

            return(StatusCode(HttpStatusCode.OK));
        }
        private bool VeLiegtDigitalVor(int?veId)
        {
            // Für die Ermittlung von VeLiegtDigitalVor kann nicht OrderItem.IdentifikationDigitalesMagazin verwendet werden.
            // Darum werden Daten vom Elastic geholt.

            ElasticArchiveRecord archiveRecord = null;

            if (veId.HasValue)
            {
                archiveRecord = Context.IndexAccess.FindDocument(veId.Value.ToString(), false);
            }

            return(!string.IsNullOrEmpty(archiveRecord?.PrimaryDataLink));
        }
示例#15
0
        private static ElasticArchiveRecord CreateElasticArchiveRecord(List <int> list)
        {
            // Arrange
            var elasticArchiveRecord = new ElasticArchiveRecord()
            {
                ArchiveRecordId   = "Start1",
                PrimaryDataLink   = "DifferentAip@DossierId",
                AggregationFields = new ElasticAggregationFields(),
                CreationPeriod    = new ElasticTimePeriod()
            };


            elasticArchiveRecord.CreationPeriod.Years = list;
            return(elasticArchiveRecord);
        }
 /// <summary>
 /// Calculate the Period how create the Record
 /// </summary>
 /// <param name="elasticArchiveRecord"></param>
 public static void CalculateCreationPeriodBuckets(ElasticArchiveRecord elasticArchiveRecord)
 {
     if (elasticArchiveRecord.CreationPeriod != null && elasticArchiveRecord.CreationPeriod.Years.Any())
     {
         elasticArchiveRecord.AggregationFields.CreationPeriodYears001 =
             elasticArchiveRecord.CreationPeriod.Years;
         elasticArchiveRecord.AggregationFields.CreationPeriodYears005 =
             elasticArchiveRecord.CreationPeriod.Years.Select(year => (int)Math.Floor(year / 5m) * 5).Distinct().ToList();
         elasticArchiveRecord.AggregationFields.CreationPeriodYears010 =
             elasticArchiveRecord.CreationPeriod.Years.Select(year => (int)Math.Floor(year / 10m) * 10).Distinct().ToList();
         elasticArchiveRecord.AggregationFields.CreationPeriodYears025 =
             elasticArchiveRecord.CreationPeriod.Years.Select(year => (int)Math.Floor(year / 25m) * 25).Distinct().ToList();
         elasticArchiveRecord.AggregationFields.CreationPeriodYears100 =
             elasticArchiveRecord.CreationPeriod.Years.Select(year => (int)Math.Floor(year / 100m) * 100).Distinct().ToList();
     }
 }
示例#17
0
        public async Task <IHttpActionResult> AddUnknowToBasket(string signatur)
        {
            if (string.IsNullOrEmpty(signatur))
            {
                return(BadRequest($"{nameof(signatur)}"));
            }

            var searchResult =
                entityProvider.SearchByReferenceCodeWithoutSecurity <ElasticArchiveRecord>(signatur);
            var searchRecordResult      = searchResult as SearchResult <ElasticArchiveRecord>;
            ElasticArchiveRecord entity = null;

            if (searchRecordResult?.Entities != null)
            {
                entity = searchRecordResult.Entities.Items[0].Data;
            }

            if (entity == null)
            {
                return(Content(HttpStatusCode.NotFound, $"No VE found by signatur {signatur}"));
            }

            if (!entity.CanBeOrdered ||
                !(entity.Level == "Dossier" || entity.Level == "Subdossier" || entity.Level == "Dokument"))
            {
                return(Content(HttpStatusCode.Conflict, "Ve can not be ordered according to index"));
            }

            var userId = ControllerHelper.GetCurrentUserId();

            // Check VE is exists already in basket
            if (int.TryParse(entity.ArchiveRecordId, out var veId) && !await client.IsUniqueVeInBasket(veId, userId))
            {
                return(Content(HttpStatusCode.OK, new OrderItemDto {
                    VeId = veId
                }));
            }

            var settings   = FrontendSettingsViaduc.Instance;
            var unknowText = settings.GetTranslation(WebHelper.GetClientLanguage(Request), "order.unknowtext",
                                                     "[Nicht sichtbar]");
            var indexSnapShot = OrderHelper.GetOrderingIndexSnapshot(entity, unknowText);

            var orderItemDb = await client.AddToBasket(indexSnapShot, ControllerHelper.GetCurrentUserId());

            return(Content(HttpStatusCode.Created, ConvertDbItemToDto(orderItemDb, OrderType.Bestellkorb, true)));
        }
        public async Task Statuswechsel_zu_Reponieren_bereit_löst_für_eine_Gebrauchskopie_download_aus()
        {
            var currentUser = Users.Vecteur;
            var besteller   = new User {
                Id = "besteller"
            };

            var item = new OrderItem
            {
                OrderId = 1, Id = 1001, VeId = 200, Benutzungskopie = false, Status = OrderStatesInternal.DigitalisierungExtern
            };
            var ordering = new Ordering {
                Id = 1, UserId = "besteller", Type = OrderType.Digitalisierungsauftrag, OrderDate = DateTime.Now
            };

            var ear = new ElasticArchiveRecord
            {
                PrimaryDataDownloadAccessTokens = new List <string>(),
                ArchiveRecordId = item.VeId?.ToString()
            };


            var auftragErledigtMock = new Mock <IConsumer <IDigitalisierungsAuftragErledigt> >();

            auftragErledigtMock.Setup(e => e.Consume(It.IsAny <ConsumeContext <IDigitalisierungsAuftragErledigt> >())).Returns(Task.CompletedTask);
            var benutzungskopieErledigtMock = new Mock <IConsumer <IBenutzungskopieAuftragErledigt> >();

            benutzungskopieErledigtMock.Setup(e => e.Consume(It.IsAny <ConsumeContext <IBenutzungskopieAuftragErledigt> >()))
            .Returns(Task.CompletedTask);

            var harness           = new InMemoryTestHarness();
            var auftragConsumer   = harness.Consumer(() => auftragErledigtMock.Object, BusConstants.DigitalisierungsAuftragErledigtEvent);
            var benutzungConsumer = harness.Consumer(() => benutzungskopieErledigtMock.Object, BusConstants.BenutzungskopieAuftragErledigtEvent);

            await harness.Start();

            await PerformTest(currentUser, besteller, ordering, item, ear, p => p.SetStatusZumReponierenBereit(), harness.Bus);

            item.Status.Should().Be(OrderStatesInternal.ZumReponierenBereit);
            auftragConsumer.Consumed.Select <IDigitalisierungsAuftragErledigt>().Any().Should().BeTrue();
            auftragErledigtMock.Verify(e => e.Consume(It.IsAny <ConsumeContext <IDigitalisierungsAuftragErledigt> >()), Times.Once);
            benutzungConsumer.Consumed.Select <IBenutzungskopieAuftragErledigt>().Any().Should().BeFalse();
            benutzungskopieErledigtMock.Verify(e => e.Consume(It.IsAny <ConsumeContext <IBenutzungskopieAuftragErledigt> >()), Times.Never);
            await harness.Stop();
        }
        public void GetNextDigitalisierungsauftrag_returns_service_not_available_if_order_manager_is_not_running()
        {
            // Arrange
            var archiveRecord = new ElasticArchiveRecord
            {
                ProtectionEndDate = new ElasticDateWithYear {
                    Date = new DateTime(1900, 12, 31), Year = 1900
                }
            };
            var controller = ArrangeControllerForGetNextDigitalisierungsauftragWithDigipoolException(new RequestTimeoutException(), archiveRecord);

            // Act
            var auftrag = controller.GetNextDigitalisierungsauftrag().GetAwaiter().GetResult();

            // Assert
            auftrag.Should().BeOfType <NegotiatedContentResult <string> >();
            ((NegotiatedContentResult <string>)auftrag).StatusCode.Should().Be(HttpStatusCode.ServiceUnavailable);
        }
        public async Task GetNextDigitalisierungsauftrag_if_digipool_is_empty_NoContent_is_returned()
        {
            // Arrange
            var archiveRecord = new ElasticArchiveRecord
            {
                ProtectionEndDate = new ElasticDateWithYear {
                    Date = new DateTime(1900, 12, 31), Year = 1900
                }
            };
            var controller = ArrangeControllerForGetNextDigitalisierungsauftrag(Array.Empty <DigipoolEntry>(), archiveRecord);

            // Act
            var auftrag = await controller.GetNextDigitalisierungsauftrag();

            // Assert
            auftrag.Should().BeOfType <StatusCodeResult>();
            ((StatusCodeResult)auftrag).StatusCode.Should().Be(HttpStatusCode.NoContent);
        }
        public void TransferDataFromPropertyBag(ElasticArchiveRecord elasticArchiveRecord, List <DataElement> detailData)
        {
            var customFields = new ExpandoObject() as IDictionary <string, object>;

            var defaultProperties = elasticArchiveRecord.GetType().GetProperties();

            foreach (var fieldConfiguration in fieldsConfiguration.Fields)
            {
                try
                {
                    var value = GetValue(detailData, fieldConfiguration);

                    if ((fieldConfiguration.TargetField == "ReferenceCode" || fieldConfiguration.TargetField == "Title") &&
                        string.IsNullOrWhiteSpace(value as string))
                    {
                        value = "Keine Angabe";
                    }

                    if (value != null)
                    {
                        if (fieldConfiguration.IsDefaultField)
                        {
                            var prop = defaultProperties.FirstOrDefault(d =>
                                                                        d.Name.ToLowerInvariant() == fieldConfiguration.TargetField.ToLowerInvariant());
                            if (prop != null)
                            {
                                prop.SetValue(elasticArchiveRecord, value);
                            }
                        }
                        else
                        {
                            customFields.Add(fieldConfiguration.TargetField, value);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.Error(ex.Message);
                }
            }

            // Add the customer fields to the "main" record
            elasticArchiveRecord.CustomFields = customFields;
        }
示例#22
0
        public static ElasticArchiveRecord Generate(long id)
        {
            var record = new ElasticArchiveRecord
            {
                ArchiveRecordId = id.ToString()
            };

            record.ArchiveRecordId      = "ID" + 71 * id;
            record.MetadataAccessTokens = GenerateAccessTokens(id);
            record.Title         = GenerateTitel(id);
            record.ReferenceCode = "RC" + 3 * id;
            record.Level         = PickFromArray(new[] { "Abteilung", "Bestand", "Serie", "Dossier", "Dokument" },
                                                 id);

            record.CreationPeriod = GetTimePeriod(id);
            record.WithinInfo     =
                PickFromArray(
                    new[] { "Diverse", "Gut erhaltene", "Teilweise historisch interessante", "Von Säure zerfressene" }, id) +
                " " +
                PickFromArray(
                    new[]
            {
                "Fotos", "Briefe", "Siegel", "Urkunden aus Pergament", "diplomatische Depeschen",
                "verschlüsselte Nachrichten"
            }, id);

            record.HasImage            = false;
            record.HasAudioVideo       = false;
            record.FormerReferenceCode = string.Empty;

            record.PlayingLengthInS = id % 31 == 0 ? (int)(91 * id) % 3600 : 0;
            record.Extent           = PickFromArray(
                new[] { "1", "2", "5", "21" }, id) +
                                      " " +
                                      PickFromArray(
                new[]
            {
                "Laufmeter", "Archivschachteln", "Dossiermappen", "Mikrofilme"
            }, id);

            record.CanBeOrdered = id % 19 < 18;

            return(record);
        }
        public void GetNextDigitalisierungsauftrag_No_protection_end_date_returns_error()
        {
            // Arrange
            var archiveRecord = new ElasticArchiveRecord {
                ProtectionEndDate = null
            };
            var digiPoolEntry = new DigipoolEntry {
                VeId = 1, ApproveStatus = ApproveStatus.FreigegebenInSchutzfrist, HasAufbereitungsfehler = false
            };

            var controller = ArrangeControllerForGetNextDigitalisierungsauftrag(new[] { digiPoolEntry }, archiveRecord);

            // Act
            var auftrag = controller.GetNextDigitalisierungsauftrag().GetAwaiter().GetResult();

            // Assert
            auftrag.Should().BeOfType <NegotiatedContentResult <string> >();
            ((NegotiatedContentResult <string>)auftrag).StatusCode.Should().Be(HttpStatusCode.RequestEntityTooLarge);
        }
        public async Task GetNextDigitalisierungsauftrag_if_ve_has_no_protectionEndDate_should_return_RequestEntityTooLarge()
        {
            // Arrange
            var digiPoolEntry = new DigipoolEntry {
                VeId = 1, ApproveStatus = ApproveStatus.FreigegebenInSchutzfrist
            };
            var archiveRecord = new ElasticArchiveRecord {
                ArchiveRecordId = "1", ProtectionEndDate = null
            };

            var controller = ArrangeControllerForGetNextDigitalisierungsauftrag(new[] { digiPoolEntry }, archiveRecord);

            // Act
            var auftrag = await controller.GetNextDigitalisierungsauftrag();

            // Assert
            auftrag.Should().BeOfType <NegotiatedContentResult <string> >();
            ((NegotiatedContentResult <string>)auftrag).StatusCode.Should().Be(HttpStatusCode.RequestEntityTooLarge);
        }
        public async Task GetNextDigitalisierungsauftrag_VE_not_in_protection_with_approve_status_FreigegebenDurchSystem_returns_false()
        {
            // Arrange
            var digiPoolEntry = new DigipoolEntry {
                VeId = 1, ApproveStatus = ApproveStatus.FreigegebenDurchSystem
            };
            var archiveRecord = new ElasticArchiveRecord
            {
                ProtectionEndDate = new ElasticDateWithYear {
                    Date = new DateTime(1900, 12, 31), Year = 1900
                }
            };
            var controller = ArrangeControllerForGetNextDigitalisierungsauftrag(new[] { digiPoolEntry }, archiveRecord);

            // Act
            var auftrag = (OkNegotiatedContentResult <DigitalisierungsAuftrag>) await controller.GetNextDigitalisierungsauftrag();

            // Assert
            auftrag.Content.Dossier.InSchutzfrist.Should().BeFalse();
        }
        public void OneTimeSetup()
        {
            var uri  = "(change here, but do not commit)";
            var node = new Uri(uri);

            helper = new ElasticIndexHelper(node, "test2");
            if (helper.IndexExists("test2"))
            {
                helper.DeleteIndex("test2");
            }

            helper.CreateIndex("test2");

            var ear = new ElasticArchiveRecord();

            ear.ArchiveRecordId = "1";
            ear.PrimaryData     = new List <ElasticArchiveRecordPackage>();

            ear.PrimaryData.Add(new ElasticArchiveRecordPackage());
            ear.PrimaryData[0].Items.Add(new ElasticRepositoryObject());
            ear.PrimaryData[0].Items[0].Content = "PrimaryDataContent";

            ear.Title        = "Title";
            ear.WithinInfo   = "WithinInfo";
            ear.CustomFields = new
            {
                zugänglichkeitGemässBga = "In Schutzfrist",
                publikationsrechte      = "ABC"
            };

            helper.Index(ear);

            // Wait till index is ready
            ISearchResponse <ElasticArchiveRecord> searchResponse;

            do
            {
                Thread.Sleep(500);
                searchResponse = Search("Title", "title");
            } while (searchResponse.Hits.Count == 0);
        }
        public async Task GetNextDigitalisierungsauftrag_with_missing_must_fields_returns_internal_exception()
        {
            // Arrange
            var digiPoolEntry = new DigipoolEntry {
                VeId = 1, ApproveStatus = ApproveStatus.FreigegebenInSchutzfrist
            };
            var archiveRecord = new ElasticArchiveRecord
            {
                ProtectionEndDate = new ElasticDateWithYear {
                    Date = new DateTime(1900, 12, 31), Year = 1900
                }
            };
            var controller = ArrangeControllerForInvalidGetNextDigitalisierungsauftrag(new[] { digiPoolEntry }, archiveRecord);

            // Act
            var auftrag = await controller.GetNextDigitalisierungsauftrag();

            // Assert
            auftrag.Should().BeOfType <NegotiatedContentResult <string> >();
            ((NegotiatedContentResult <string>)auftrag).StatusCode.Should().Be(HttpStatusCode.RequestEntityTooLarge);
        }
        public void GetNextDigitalisierungsauftrag_Digipool_returns_only_faulted_items_should_return_403_return_code()
        {
            // Arrange
            var archiveRecord = new ElasticArchiveRecord
            {
                ProtectionEndDate = new ElasticDateWithYear {
                    Date = new DateTime(1900, 12, 31), Year = 1900
                }
            };
            var digiPoolEntry = new DigipoolEntry {
                VeId = 1, ApproveStatus = ApproveStatus.FreigegebenInSchutzfrist, HasAufbereitungsfehler = true
            };
            var controller = ArrangeControllerForGetNextDigitalisierungsauftrag(new[] { digiPoolEntry }, archiveRecord);

            // Act
            var auftrag = controller.GetNextDigitalisierungsauftrag().GetAwaiter().GetResult();

            // Assert
            auftrag.Should().BeOfType <NegotiatedContentResult <string> >();
            ((NegotiatedContentResult <string>)auftrag).StatusCode.Should().Be(HttpStatusCode.Forbidden);
        }
        public void When_Providing_Unknown_Test_It_Should_Fill_Every_Secret_Property_With_UnknownText()
        {
            // arrange
            var record = new ElasticArchiveRecord();

            SetAllStringPropertiesWithThisText(record, "SECRET");

            record.Containers = new List <ElasticContainer>
            {
                new ElasticContainer
                {
                    ContainerCode            = "SECRET",
                    ContainerCarrierMaterial = "SECRET",
                    ContainerLocation        = "SECRET",
                    ContainerType            = "SECRET",
                    IdName = "SECRET"
                }
            };

            // these fields are allowed to contain the secret texts
            var exceptions = new[]
            {
                nameof(OrderingIndexSnapshot.VeId),
                nameof(OrderingIndexSnapshot.Signatur),
                nameof(OrderingIndexSnapshot.ZugaenglichkeitGemaessBga)
            };

            // act
            var snapshot = OrderHelper.GetOrderingIndexSnapshot(record, "HIDDEN");

            // assert
            foreach (var prop in typeof(OrderingIndexSnapshot)
                     .GetProperties()
                     .Where(p => p.PropertyType == typeof(string) && !exceptions.Contains(p.Name)))
            {
                var value = prop.GetValue(snapshot);
                value.Should().Be("HIDDEN", $"Field {prop.Name} must not leak secret details");
            }
        }
        public void GetNextDigitalisierungsauftrag_SQL_Server_not_available_returns_service_not_available()
        {
            // Arrange
            var archiveRecord = new ElasticArchiveRecord
            {
                ProtectionEndDate = new ElasticDateWithYear {
                    Date = new DateTime(1900, 12, 31), Year = 1900
                }
            };
            // Setup specific exception that signals that database is down
            var fe = new FaultEvent <OrderDatabaseNotFoundOrNotRunningException>(new OrderDatabaseNotFoundOrNotRunningException(), new Guid(), null,
                                                                                 new OrderDatabaseNotFoundOrNotRunningException(), null);
            var ex = new RequestFaultException("", fe);

            var controller = ArrangeControllerForGetNextDigitalisierungsauftragWithDigipoolException(ex, archiveRecord);

            // Act
            var auftrag = controller.GetNextDigitalisierungsauftrag().GetAwaiter().GetResult();

            // Assert
            auftrag.Should().BeOfType <NegotiatedContentResult <string> >();
            ((NegotiatedContentResult <string>)auftrag).StatusCode.Should().Be(HttpStatusCode.ServiceUnavailable);
        }