public void When_ResourceKey_Type_Does_Not_Start_With_Letter_Then_Invalid(string resourceKey)
        {
            // Arrange
            var resourceKeyAttribute = new ResourceKeyAttribute();

            // Act
            var isValid = resourceKeyAttribute.IsValid(resourceKey);

            // Assert
            isValid.Should().BeFalse();
        }
        public void When_ResourceKey_Does_Not_Slash_Type_Then_Invalid()
        {
            // Arrange
            var resourceKeyAttribute = new ResourceKeyAttribute();

            // Act
            var isValid = resourceKeyAttribute.IsValid("SiteGroupE0300EEE-1199-48EE-8B55-06F1EBF7B4C3");

            // Assert
            isValid.Should().BeFalse();
        }
        public void When_ResourceKey_Contains_Correct_Values_Then_Valid(string resourceKey)
        {
            // Arrange
            var resourceKeyAttribute = new ResourceKeyAttribute();

            // Act
            var isValid = resourceKeyAttribute.IsValid(resourceKey);

            // Assert
            isValid.Should().BeTrue();
        }
        public void When_ResourceKey_Does_Not_Contain_Guid_Then_Invalid()
        {
            // Arrange
            var resourceKeyAttribute = new ResourceKeyAttribute();

            // Act
            var isValid = resourceKeyAttribute.IsValid("SiteGroup/");

            // Assert
            isValid.Should().BeFalse();
        }
        private async Task Process(CancellationToken stoppingToken)
        {
            using var scope = this.ServiceScopeFactory.CreateScope();
            FairplaytubeDatabaseContext fairplaytubeDatabaseContext =
                scope.ServiceProvider.GetRequiredService <FairplaytubeDatabaseContext>();
            var translationService =
                scope.ServiceProvider.GetRequiredService <TranslationService>();
            var clientAppAssembly = typeof(Client.Program).Assembly;
            var clientAppTypes    = clientAppAssembly.GetTypes();

            var componentsAssembly = typeof(Components._Imports).Assembly;
            var componentsTypes    = componentsAssembly.GetTypes();

            var modelsAssembly = typeof(Models.Video.UploadVideoModel).Assembly;
            var modelsTypes    = modelsAssembly.GetTypes();

            var servicesAssembly = typeof(FairPlayTube.Services.TranslationService).Assembly;
            var servicesTypes    = servicesAssembly.GetTypes();

            var commonAssembly = typeof(FairPlayTube.Common.Global.Constants).Assembly;
            var commonTypes    = commonAssembly.GetTypes();

            List <Type> typesToCheck = new();

            typesToCheck.AddRange(clientAppTypes);
            typesToCheck.AddRange(componentsTypes);
            typesToCheck.AddRange(modelsTypes);
            typesToCheck.AddRange(servicesTypes);
            typesToCheck.AddRange(commonTypes);

            foreach (var singleTypeToCheck in typesToCheck)
            {
                string typeFullName = singleTypeToCheck.FullName;
                var    fields       = singleTypeToCheck.GetFields(
                    BindingFlags.Public |
                    BindingFlags.Static |
                    BindingFlags.FlattenHierarchy
                    );
                foreach (var singleField in fields)
                {
                    var resourceKeyAttributes =
                        singleField.GetCustomAttributes <ResourceKeyAttribute>();
                    if (resourceKeyAttributes != null && resourceKeyAttributes.Any())
                    {
                        ResourceKeyAttribute keyAttribute = resourceKeyAttributes.Single();
                        var    defaultValue = keyAttribute.DefaultValue;
                        string key          = singleField.GetRawConstantValue().ToString();
                        var    entity       =
                            await fairplaytubeDatabaseContext.Resource
                            .SingleOrDefaultAsync(p => p.CultureId == 1 &&
                                                  p.Key == key &&
                                                  p.Type == typeFullName, stoppingToken);

                        if (entity is null)
                        {
                            entity = new Resource()
                            {
                                CultureId = 1,
                                Key       = key,
                                Type      = typeFullName,
                                Value     = keyAttribute.DefaultValue
                            };
                            await fairplaytubeDatabaseContext.Resource.AddAsync(entity, stoppingToken);
                        }
                    }
                }
            }
            if (fairplaytubeDatabaseContext.ChangeTracker.HasChanges())
            {
                await fairplaytubeDatabaseContext.SaveChangesAsync(stoppingToken);
            }
            var allEnglishUSKeys =
                await fairplaytubeDatabaseContext.Resource
                .Include(p => p.Culture)
                .Where(p => p.Culture.Name == "en-US")
                .ToListAsync(stoppingToken);

            TranslateRequestTextItem[] translateRequestItems =
                allEnglishUSKeys.Select(p => new TranslateRequestTextItem()
            {
                Text = p.Value
            }).ToArray();

            var additionalSupportedCultures = await fairplaytubeDatabaseContext.Culture
                                              .Where(p => p.Name != "en-US").ToListAsync(cancellationToken: stoppingToken);

            foreach (var singleAdditionalCulture in additionalSupportedCultures)
            {
                var cultureTranslations = await
                                          translationService.TranslateAsync(translateRequestItems,
                                                                            "en",
                                                                            singleAdditionalCulture.Name, stoppingToken);

                var cultureEntity = await fairplaytubeDatabaseContext
                                    .Culture.SingleAsync(p => p.Name == singleAdditionalCulture.Name, cancellationToken : stoppingToken);

                for (int iPos = 0; iPos < cultureTranslations.Length; iPos++)
                {
                    var      singleEnglishUSKey = allEnglishUSKeys[iPos];
                    var      translatedValue    = cultureTranslations[iPos].translations.First().text;
                    Resource resourceEntity     = await fairplaytubeDatabaseContext.Resource
                                                  .SingleOrDefaultAsync(p => p.Key == singleEnglishUSKey.Key &&
                                                                        p.Type == singleEnglishUSKey.Type &&
                                                                        p.CultureId == cultureEntity.CultureId, cancellationToken : stoppingToken);

                    if (resourceEntity is null)
                    {
                        resourceEntity = new()
                        {
                            Key       = singleEnglishUSKey.Key,
                            Type      = singleEnglishUSKey.Type,
                            Value     = translatedValue,
                            CultureId = cultureEntity.CultureId
                        };
                        await fairplaytubeDatabaseContext.Resource.AddAsync(resourceEntity, stoppingToken);
                    }
                }
                if (fairplaytubeDatabaseContext.ChangeTracker.HasChanges())
                {
                    await fairplaytubeDatabaseContext.SaveChangesAsync(stoppingToken);
                }
            }
        }
    }