public void Should_generate_a_query_for_each_child_entity_type_in_the_aggregate()
            {
                var domainModel = _domainModelProvider.GetDomainModel();
                var entity      = domainModel.GetEntity <School>();

                var aggregateChildEntities = entity.Aggregate.Members
                                             .Concat(entity.BaseEntity.Aggregate.Members)
                                             .Where(e => !e.IsAggregateRoot)
                                             .ToList();

                var expectedQueries = aggregateChildEntities
                                      .Select(e => GetExpectedQuery(e, entity.Aggregate))
                                      .OrderBy(x => x)
                                      .ToList();

                var expectedHqlQueriesText = string.Join("\r\n", expectedQueries);
                var actualHqlQueriesText   = string.Join("\r\n", _actualHqlQueries.Skip(1).OrderBy(x => x));

                Assert.That(
                    actualHqlQueriesText,
                    Is.EqualTo(expectedHqlQueriesText),
                    $@"Expected:
{expectedHqlQueriesText}
Actual:
{actualHqlQueriesText}");
            }
Beispiel #2
0
 public void Should_register_the_Aggregate_extension_type_with_the_extensions_registrar()
 {
     _registrarStub.AssertWasCalled(
         x =>
         x.RegisterAggregateExtensionEntity(
             typeof(StaffLeave),
             _domainModelProvider.GetDomainModel()
             .Entities.First(e => e.Name == "StaffLeaveReason")),
         y => y.Repeat.Once());
 }
        public IHttpActionResult Get()
        {
            var dataModels = _domainModelProvider
                             .GetDomainModel()
                             .Schemas
                             .Select(
                s => new
            {
                name    = s.LogicalName,
                version = s.Version
            })
                             .ToArray();

            var content = new
            {
                version = _apiVersionProvider.Version,
                informationalVersion = _apiVersionProvider.InformationalVersion,
                suite      = _apiVersionProvider.Suite,
                build      = _apiVersionProvider.Build,
                apiMode    = _apiConfigurationProvider.Mode.DisplayName,
                dataModels = dataModels
            };

            return(Ok(content));
        }
Beispiel #4
0
 private IDictionary <string, string> LazyInitializeDescriptorEntityTypeFullNameByEntityName()
 {
     return(_domainModelProvider.GetDomainModel()
            .Entities.Where(e => e.IsDescriptorEntity)
            .ToDictionary(
                k => k.Name,
                v => v.EntityTypeFullName(v.SchemaProperCaseName())));
 }
            public void Should_generate_a_query_for_each_entity_in_the_aggregate()
            {
                var domainModel = _domainModelProvider.GetDomainModel();
                var entity      = domainModel.GetEntity <StudentEducationOrganizationAssociation>();

                var aggregateChildEntities = entity.Aggregate
                                             .Members
                                             .ToList();

                var expectedQueries = aggregateChildEntities
                                      .Select(GetExpectedQuery)
                                      .ToList();

                Assert.That(
                    _actualHqlQueries.OrderBy(x => x.Length),
                    Is.EquivalentTo(expectedQueries.OrderBy(x => x.Length)));
            }
        public EntityExtensionRegistrar(IEnumerable <Assembly> extensionAssemblies, IDomainModelProvider domainModelProvider)
        {
            _domainModel = domainModelProvider.GetDomainModel();

            foreach (Assembly extensionAssembly in extensionAssemblies)
            {
                RegisterExtensions(extensionAssembly);
            }
        }
        private Aggregate GetAggregate()
        {
            string schema   = typeof(TEntity).GetCustomAttribute <SchemaAttribute>().Schema;
            var    fullName = new FullName(schema, typeof(TEntity).Name);

            Aggregate aggregate;

            if (!_domainModelProvider.GetDomainModel().AggregateByName.TryGetValue(fullName, out aggregate))
            {
                throw new Exception($"Unable to find aggregate for '{fullName}'.");
            }

            return(aggregate);
        }
            protected override void Arrange()
            {
                _swaggerDocumentContext = new SwaggerDocumentContext(
                    DomainModelDefinitionsProviderHelper
                    .ResourceModelProvider
                    .GetResourceModel());

                _genericSwaggerDefinitionFactory =
                    SwaggerDocumentFactoryHelper.CreateSwaggerDefinitionsFactory(
                        _swaggerDocumentContext);

                _domainModelProvider = DomainModelDefinitionsProviderHelper.DomainModelProvider;

                _schemaNameMapProvider = _domainModelProvider.GetDomainModel()
                                         .SchemaNameMapProvider;
            }
            protected override void Arrange()
            {
                _openApiMetadataDocumentContext = new OpenApiMetadataDocumentContext(
                    DomainModelDefinitionsProviderHelper
                    .ResourceModelProvider
                    .GetResourceModel());

                _genericOpenApiMetadataDefinitionFactory =
                    OpenApiMetadataDocumentFactoryHelper.CreateOpenApiMetadataDefinitionsFactory(
                        _openApiMetadataDocumentContext);

                _domainModelProvider = DomainModelDefinitionsProviderHelper.DomainModelProvider;

                _schemaNameMapProvider = _domainModelProvider.GetDomainModel()
                                         .SchemaNameMapProvider;
            }
        private IEnumerable <OpenApiContent> CreateSchemaSpecificSections()
        {
            return(new[]
            {
                new OpenApiContent(
                    OpenApiMetadataSections.SdkGen,
                    EdFi,
                    new Lazy <string>(
                        () =>
                        new SwaggerDocumentFactory(
                            new SwaggerDocumentContext(_resourceModelProvider.GetResourceModel())
                {
                    RenderType = RenderType.GeneralizedExtensions,
                    IsIncludedExtension = x => x.FullName.Schema.Equals(EdFiConventions.PhysicalSchemaName)
                }).Create(_openApiMetadataResourceFilters[EdFi])),
                    _odsDataBasePath)
            }.Concat(
                       _domainModelProvider.GetDomainModel()

                       // All the extension schemas.
                       .Schemas.Where(
                           x => !x.LogicalName.EqualsIgnoreCase(EdFiConventions.LogicalName))
                       .Select(
                           schema =>
                           new
            {
                UriSegment = _schemaNameMapProvider.GetSchemaMapByLogicalName(schema.LogicalName)
                             .UriSegment,
                Factory =
                    SwaggerDocumentFactoryHelper.GetExtensionOnlySwaggerDocumentFactory(
                        _resourceModelProvider.GetResourceModel(),
                        schema)
            })
                       .Select(
                           sf =>
                           new OpenApiContent(
                               OpenApiMetadataSections.Extensions,
                               sf.UriSegment,
                               new Lazy <string>(() => sf.Factory.Create(_openApiMetadataResourceFilters[Extensions])),
                               _odsDataBasePath))
                       ));
        }
        public IReadOnlyList <DeletedResource> Execute(string schemaUriSegment, string urlResourcePluralName, IQueryParameters queryParameters)
        {
            var entity = _domainModelProvider.GetDomainModel().ResourceModel.GetAllResources().SingleOrDefault(
                r => r.SchemaUriSegment() == schemaUriSegment &&
                r.PluralName.EqualsIgnoreCase(urlResourcePluralName))?.Entity;

            if (entity == null)
            {
                throw new ArgumentException(
                          $"Unable to find entity for provided schema uri segment {schemaUriSegment} and url resource {urlResourcePluralName}.");
            }

            var cmdSql = $"SELECT Id, {ChangeQueriesDatabaseConstants.ChangeVersionColumnName}" +
                         $" FROM {ChangeQueriesDatabaseConstants.TrackedDeletesSchemaPrefix}{entity.Schema}.{entity.TableName(_databaseEngine)}";

            if (queryParameters.MinChangeVersion.HasValue)
            {
                cmdSql += $" WHERE {ChangeQueriesDatabaseConstants.ChangeVersionColumnName} >= {queryParameters.MinChangeVersion.Value}";
            }

            if (queryParameters.MaxChangeVersion.HasValue)
            {
                cmdSql += queryParameters.MinChangeVersion.HasValue
                    ? " AND "
                    : " WHERE ";

                cmdSql += $"{ChangeQueriesDatabaseConstants.ChangeVersionColumnName} <= {queryParameters.MaxChangeVersion.Value}";
            }

            cmdSql += $" ORDER BY {ChangeQueriesDatabaseConstants.ChangeVersionColumnName}";

            using (var sessionScope = new SessionScope(_sessionFactory))
            {
                var query = sessionScope.Session.CreateSQLQuery(cmdSql)
                            .SetFirstResult(queryParameters.Offset ?? 0)
                            .SetMaxResults(queryParameters.Limit ?? 25)
                            .SetResultTransformer(Transformers.AliasToBean <DeletedResource>());

                return(query.List <DeletedResource>().ToReadOnlyList());
            }
        }
        public EducationOrganizationIdNamesProvider(IDomainModelProvider domainModelProvider)
        {
            _concreteEducationOrganizationIdNames = new Lazy<string[]>(() =>
            {
                // Get the EducationOrganization base entity
                var edOrgEntity = domainModelProvider.GetDomainModel().EducationOrganizationBaseEntity();
                
                var derivedEntities = edOrgEntity.DerivedEntities;

                return derivedEntities.Select(e => e.Identifier.Properties.Single().PropertyName).ToArray();
            });
            
            _sortedEducationOrganizationIdNames =
                new Lazy<List<string>>(
                    () =>
                    {
                        var sortedEdOrgNames = new List<string>(GetAllNames());
                        sortedEdOrgNames.Sort();

                        return sortedEdOrgNames;
                    });
        }
            public void Should_generate_a_query_for_each_child_entity_type_in_the_aggregate()
            {
                var domainModel = _domainModelProvider.GetDomainModel();
                var entity      = domainModel.GetEntity <Student>();

                var aggregateChildEntities = entity.Aggregate
                                             .Members
                                             .Where(e => !e.IsAggregateRoot)
                                             .ToList();

                var expectedQueries = aggregateChildEntities
                                      .Select(GetExpectedQuery)
                                      .OrderBy(x => x)
                                      .ToList();

                var expectedHqlQueriesText = string.Join(Environment.NewLine, expectedQueries);
                var actualHqlQueriesText   = string.Join(Environment.NewLine, _actualHqlQueries.Skip(1).OrderBy(x => x));

                Assert.That(
                    actualHqlQueriesText,
                    Is.EqualTo(expectedHqlQueriesText));
            }
Beispiel #14
0
 protected override void Act()
 {
     _domainModel = _domainModelProvider.GetDomainModel();
 }
        public IActionResult Get()
        {
            var content = new
            {
                version = _apiVersionProvider.Version,
                informationalVersion = _apiVersionProvider.InformationalVersion,
                suite      = _apiVersionProvider.Suite,
                build      = _apiVersionProvider.Build,
                apiMode    = _apiSettings.GetApiMode().DisplayName,
                dataModels = _domainModelProvider
                             .GetDomainModel()
                             .Schemas
                             .Select(
                    s => new
                {
                    name    = s.LogicalName,
                    version = s.Version
                })
                             .ToArray(),
                urls = GetUrlsByName()
            };

            return(Ok(content));

            Dictionary <string, string> GetUrlsByName()
            {
                var currentYear = _systemDateProvider.GetDate().Year.ToString();

                // since instance is dynamic and given through url, this value is just a place holder
                var instance = "{instance}";

                bool isInstanceYearSpecific = _apiSettings.GetApiMode().Equals(ApiMode.InstanceYearSpecific);

                bool isYearSpecific = _apiSettings.GetApiMode().Equals(ApiMode.YearSpecific) ||
                                      isInstanceYearSpecific;

                bool useReverseProxyHeaders = _apiSettings.UseReverseProxyHeaders ?? false;

                var urlsByName = new Dictionary <string, string>(StringComparer.InvariantCultureIgnoreCase);

                if (_apiSettings.IsFeatureEnabled(ApiFeature.AggregateDependencies.GetConfigKeyName()))
                {
                    urlsByName["dependencies"] = Request.RootUrl(useReverseProxyHeaders) +
                                                 (isInstanceYearSpecific
                                                        ? $"/metadata/data/v{ApiVersionConstants.Ods}/" + $"{instance}/" +
                                                  currentYear + "/dependencies"
                                                        : (isYearSpecific
                                                            ? $"/metadata/data/v{ApiVersionConstants.Ods}/" + currentYear +
                                                           "/dependencies"
                                                            : $"/metadata/data/v{ApiVersionConstants.Ods}/dependencies"));
                }

                if (_apiSettings.IsFeatureEnabled(ApiFeature.OpenApiMetadata.GetConfigKeyName()))
                {
                    urlsByName["openApiMetadata"] = Request.RootUrl(useReverseProxyHeaders) + "/metadata/" +
                                                    (isInstanceYearSpecific
                                                    ? $"{instance}/"
                                                    : string.Empty) +
                                                    (isYearSpecific
                                                    ? currentYear
                                                    : string.Empty);
                }

                urlsByName["oauth"] = Request.RootUrl(useReverseProxyHeaders) +
                                      (isInstanceYearSpecific
                                             ? $"/{instance}"
                                             : string.Empty) +
                                      "/oauth/token";

                urlsByName["dataManagementApi"] = Request.RootUrl(useReverseProxyHeaders) +
                                                  $"/data/v{ApiVersionConstants.Ods}/" +
                                                  (isInstanceYearSpecific
                                           ? $"{instance}/"
                                           : string.Empty) +
                                                  (isYearSpecific
                                           ? currentYear
                                           : string.Empty);

                if (_apiSettings.IsFeatureEnabled(ApiFeature.XsdMetadata.GetConfigKeyName()))
                {
                    urlsByName["xsdMetadata"] = Request.RootUrl(useReverseProxyHeaders) + "/metadata/" +
                                                (isInstanceYearSpecific
                                                       ? $"{instance}/"
                                                       : string.Empty) +
                                                (isYearSpecific
                                                       ? $"{currentYear}/"
                                                       : string.Empty) +
                                                "xsd";
                }

                return(urlsByName);
            }
        }
        public IActionResult Get()
        {
            var dataModels = _domainModelProvider
                             .GetDomainModel()
                             .Schemas
                             .Select(
                s => new
            {
                name    = s.LogicalName,
                version = s.Version
            })
                             .ToArray();

            var exposedUrls = GetUrls();

            var content = new
            {
                version = _apiVersionProvider.Version,
                informationalVersion = _apiVersionProvider.InformationalVersion,
                suite      = _apiVersionProvider.Suite,
                build      = _apiVersionProvider.Build,
                apiMode    = _apiSettings.GetApiMode().DisplayName,
                dataModels = dataModels,
                urls       = new
                {
                    openApiMetadata   = exposedUrls.MetaDataUrl,
                    dependencies      = exposedUrls.DependenciesUrl,
                    oauth             = exposedUrls.OauthUrl,
                    dataManagementApi = exposedUrls.ApiUrl,
                }
            };

            return(Ok(content));

            ExposedUrls GetUrls()
            {
                var currentYear = _systemDateProvider.GetDate().Year.ToString();

                // since instance is dynamic and given through url, this value is just a place holder
                var instance = "{instance}";

                bool isYearSpecific         = _apiSettings.GetApiMode().Equals(ApiMode.YearSpecific);
                bool isInstanceYearSpecific = _apiSettings.GetApiMode().Equals(ApiMode.InstanceYearSpecific);

                //This also involves year itself, thus year needs to be true
                if (isInstanceYearSpecific)
                {
                    isYearSpecific = true;
                }

                bool useReverseProxyHeaders = _apiSettings.UseReverseProxyHeaders ?? false;

                var exposedUrls = new ExposedUrls
                {
                    DependenciesUrl = Request.RootUrl(useReverseProxyHeaders) +
                                      (isInstanceYearSpecific
                                          ? $"/metadata/data/v{ApiVersionConstants.Ods}/" + $"{instance}/" + currentYear + "/dependencies" :
                                       (isYearSpecific
                                              ? $"/metadata/data/v{ApiVersionConstants.Ods}/" + currentYear + "/dependencies"
                                              : $"/metadata/data/v{ApiVersionConstants.Ods}/dependencies")),
                    MetaDataUrl = Request.RootUrl(useReverseProxyHeaders) + "/metadata/" +
                                  (isInstanceYearSpecific
                                      ? $"{instance}/"
                                      : string.Empty) +
                                  (isYearSpecific
                                      ? currentYear
                                      : string.Empty),
                    OauthUrl = Request.RootUrl(useReverseProxyHeaders) +
                               (isInstanceYearSpecific
                                   ? $"/{instance}"
                                   : string.Empty) +
                               "/oauth/token",
                    ApiUrl = Request.RootUrl(useReverseProxyHeaders) +
                             $"/data/v{ApiVersionConstants.Ods}/" +
                             (isInstanceYearSpecific
                                 ? $"{instance}/"
                                 : string.Empty) +
                             (isYearSpecific
                                 ? currentYear
                                 : string.Empty)
                };

                return(exposedUrls);
            }
        }