private static void ProcessToOtherController(AutumnSettings settings, Operation operation,
                                                     ControllerActionDescriptor actionDescriptor)
        {
            if (operation.Parameters.Count > actionDescriptor.MethodInfo.GetParameters().Length)
            {
                operation.Parameters.Clear();
            }
            foreach (var parameterInfo in actionDescriptor.MethodInfo.GetParameters())
            {
                var parameterType = parameterInfo.ParameterType;

                if (parameterType.IsGenericType && (typeof(IPageable <>).IsSubclassOfRawGeneric(parameterType) ||
                                                    typeof(Page <>).IsSubclassOfRawGeneric(parameterType)))
                {
                    BuildPageableParameters(settings, operation, parameterType.GetGenericArguments()[0]);
                }

                if (!parameterType.IsGenericType ||
                    (!typeof(Expression <>).IsSubclassOfRawGeneric(parameterType)))
                {
                    continue;
                }
                {
                    BuildQueryParameters(settings, operation);
                }
            }
        }
Beispiel #2
0
 public RepositoryControllerAsync(ICrudPageableRepositoryAsync <TEntity, TKey> repository,
                                  AutumnSettings settings, IHttpContextAccessor httpContextAccessor)
 {
     _repository          = repository;
     _settings            = settings ?? throw new ArgumentNullException(nameof(settings));
     _entityInfo          = _settings.DataSettings().EntitiesInfos[typeof(TEntity)];
     _httpContextAccessor = httpContextAccessor;
 }
Beispiel #3
0
 public static AutumnDataSettings DataSettings(this AutumnSettings settings)
 {
     if (settings == null)
     {
         throw new ArgumentNullException(nameof(settings));
     }
     return(dataSettings.GetOrAdd(settings, new AutumnDataSettings(settings)));
 }
Beispiel #4
0
        public MongoDBCrudPageableRepositoryAsync(AutumnSettings settings,
                                                  AutumnMongoDBSettings mongoDbSettings) :
            base(settings)
        {
            _filterDefinitionBuilder = new FilterDefinitionBuilder <TEntity>();
            var client         = new MongoClient(mongoDbSettings.ConnectionString);
            var database       = client.GetDatabase(mongoDbSettings.Database);
            var collectionInfo = mongoDbSettings.CollectionInfos[typeof(TEntity)];

            _collection = database.GetCollection <TEntity>(collectionInfo.Name);
        }
        private static void BuildQueryParameters(AutumnSettings settings, Operation operation)
        {
            IParameter parameter = new NonBodyParameter
            {
                Type        = "string",
                In          = "query",
                Description = "Query to search (cf. http://tools.ietf.org/html/draft-nottingham-atompub-fiql-00)",
                Name        = settings.QueryField
            };

            operation.Parameters.Add(parameter);
        }
        private static void BuildPageableParameters(AutumnSettings settings, Operation operation, Type entityType)
        {
            var genericPageType = typeof(Page <>);
            var pageType        = genericPageType.MakeGenericType(entityType);
            var schema          = GetOrRegistrySchema(pageType, HttpMethod.Get, settings.NamingStrategy);

            operation.Responses = new Dictionary <string, Response>
            {
                { "200", new Response()
                  {
                      Schema = schema, Description = "OK"
                  } },
                { "206", new Response()
                  {
                      Schema = schema, Description = "Partial Content"
                  } }
            };

            IParameter parameter;

            parameter = new NonBodyParameter
            {
                In          = "query",
                Type        = "integer",
                Minimum     = 0,
                Format      = "int32",
                Description = "Size of the page",
                Default     = settings.PageSize,
                Name        = settings.PageSizeField
            };
            operation.Parameters.Add(parameter);

            parameter = new NonBodyParameter
            {
                In          = "query",
                Type        = "integer",
                Description = "Paging number (start to zero)",
                Minimum     = 0,
                Format      = "int32",
                Default     = 0,
                Name        = settings.PageNumberField
            };
            operation.Parameters.Add(parameter);
        }
Beispiel #7
0
 private static Expression <Func <T, bool> > GetOrRegistryQuery(string query, AutumnSettings autumnSettings)
 {
     lock (QueryExpressionHelper.QueriesCache)
     {
         if (string.IsNullOrWhiteSpace(query))
         {
             return(QueryExpressionHelper.True <T>());
         }
         var hash = Hash($"{typeof(T).FullName}?{query}");
         if (QueryExpressionHelper.QueriesCache.TryGetValue(hash, out Expression <Func <T, bool> > result))
         {
             return(result);
         }
         var antlrInputStream  = new AntlrInputStream(query);
         var lexer             = new QueryLexer(antlrInputStream);
         var commonTokenStream = new CommonTokenStream(lexer);
         var parser            = new QueryParser(commonTokenStream);
         var eval    = parser.or();
         var visitor = new DefaultQueryVisitor <T>(autumnSettings.NamingStrategy);
         result = visitor.VisitOr(eval);
         QueryExpressionHelper.QueriesCache.Set(hash, result);
         return(result);
     }
 }
 protected CrudPageableRepositoryAsync(AutumnSettings settings)
 {
     _parameter  = Expression.Parameter(typeof(TEntity));
     _settings   = settings ?? throw new ArgumentNullException(nameof(settings));
     _entityInfo = _settings.DataSettings().EntitiesInfos[typeof(TEntity)];
 }
 /// <summary>
 /// initialize a new instance of controller
 /// </summary>
 /// <param name="repository"></param>
 /// <param name="settings"></param>
 /// <param name="httpContextAccessor"></param>
 public DefaultCrudPageableRepositortyController(ICrudPageableRepositoryAsync <TEntity, TKey> repository,
                                                 AutumnSettings settings, IHttpContextAccessor httpContextAccessor, ILogger <TEntity> logger)
     : base(repository, settings, httpContextAccessor)
 {
     _logger = logger;
 }
Beispiel #10
0
 public DefaultSwaggerOperationFilter(AutumnSettings settings) : base(settings)
 {
 }
Beispiel #11
0
 public EntityFrameworkCrudPageableRepositoryAsync(AutumnSettings settings, DbContext dbContext) : base(settings)
 {
     _dbContext = dbContext;
 }
Beispiel #12
0
 public QueryModelBinder(AutumnSettings autumnSettings)
 {
     _autumnSettings = autumnSettings ?? throw new ArgumentNullException(nameof(autumnSettings));
 }
 public RespositoryControllerFeatureProvider(AutumnSettings settings)
 {
     _settings = settings ?? throw new ArgumentNullException(nameof(settings));
 }
 public AutumnDataSettings(AutumnSettings parent)
 {
     Parent = parent;
 }
        private static void ProcessToRepositoryControllerAsync(AutumnSettings settings, Operation operation,
                                                               ControllerActionDescriptor actionDescriptor)
        {
            // find entity type
            var entityType = actionDescriptor.ControllerTypeInfo.GetGenericArguments()[0];

            // find entity type info
            if (!settings.DataSettings().ResourceInfos.ContainsKey(entityType))
            {
                return;
            }
            var resourceInfo = settings.DataSettings().ResourceInfos[entityType];
            // register response swagger schema for GET request
            var entitySchemaGet = GetOrRegistrySchema(entityType, HttpMethod.Get, settings.NamingStrategy);
            // register request swagger schema for POST request
            var entitySchemaPost = GetOrRegistrySchema(resourceInfo.ProxyRequestTypes[HttpMethod.Post], HttpMethod.Post, settings.NamingStrategy);
            // register request swagger schema for PUT request
            var entitySchemaPut                 = GetOrRegistrySchema(resourceInfo.ProxyRequestTypes[HttpMethod.Put], HttpMethod.Put, settings.NamingStrategy);
            var errorSchemaBadRequest           = GetOrRegistrySchema(typeof(ErrorModelBadRequest), HttpMethod.Get, settings.NamingStrategy);
            var errorSchemaInternalErrorRequest = GetOrRegistrySchema(typeof(ErrorModelInternalError), HttpMethod.Get, settings.NamingStrategy);

            operation.Responses = new ConcurrentDictionary <string, Response>();
            // add generic reponse for internal error from server
            operation.Responses.Add(((int)HttpStatusCode.BadRequest).ToString(), new Response()
            {
                Schema = errorSchemaBadRequest
            });
            // add generic reponse for internal error from server
            operation.Responses.Add(((int)HttpStatusCode.InternalServerError).ToString(), new Response()
            {
                Schema = errorSchemaInternalErrorRequest
            });
            operation.Consumes.Clear();

            IParameter parameter;

            // create operation description in term of ActionName
            switch (actionDescriptor.ActionName)
            {
            // operation is "Put"
            case "Put":
                operation.Consumes.Add(ConsumeContentType);
                parameter                         = operation.Parameters.Single(p => p.Name == "id");
                parameter.Description             = "ID of the object to update";
                parameter                         = operation.Parameters.Single(p => p.Name == "entityPutRequest");
                parameter.Name                    = "entity";
                parameter.Description             = "New value of the object";
                ((BodyParameter)parameter).Schema = entitySchemaPut;
                parameter.Required                = true;

                operation.Responses.Add(((int)HttpStatusCode.OK).ToString(),
                                        new Response()
                {
                    Schema = entitySchemaGet, Description = "Resource is Updated"
                });
                break;

            case "Delete":
                operation.Consumes.Add(ConsumeContentType);
                parameter             = operation.Parameters.Single(p => p.Name == "id");
                parameter.Description = "ID of the object to delete";
                parameter.Required    = true;
                operation.Responses.Add(((int)HttpStatusCode.OK).ToString(),
                                        new Response()
                {
                    Schema = entitySchemaGet, Description = "Resource is deleted"
                });
                break;

            case "Post":
                operation.Consumes.Add(ConsumeContentType);
                parameter                         = operation.Parameters.Single(p => p.Name == "entityPostRequest");
                parameter.Name                    = "entity";
                parameter.Description             = "Object to create";
                parameter.Required                = true;
                ((BodyParameter)parameter).Schema = entitySchemaPost;
                operation.Responses.Add(((int)HttpStatusCode.Created).ToString(),
                                        new Response()
                {
                    Schema = entitySchemaGet, Description = "Resource is created"
                });
                break;

            case "GetById":
                parameter             = operation.Parameters.Single(p => p.Name == "id");
                parameter.Description = "ID of resource to search";
                parameter.Required    = true;
                operation.Responses.Add(((int)HttpStatusCode.OK).ToString(),
                                        new Response()
                {
                    Schema = entitySchemaGet
                });
                operation.Responses.Add(((int)HttpStatusCode.NotFound).ToString(),
                                        new Response()
                {
                    Description = "Resource not Found"
                });
                break;

            default:
                operation.Parameters.Clear();
                BuildQueryParameters(settings, operation);
                BuildPageableParameters(settings, operation, entityType);
                break;
            }
        }
 public PageableModelBinderProvider(AutumnSettings autumnSettings)
 {
     _autumnSettings = autumnSettings ?? throw new ArgumentNullException(nameof(autumnSettings));
 }
 public SwaggerOperationFilter(AutumnSettings autumnSettings)
 {
     _autumnSettings = autumnSettings;
 }
Beispiel #18
0
 public SwaggerDocumentFilter(AutumnSettings settings)
 {
     _settings = settings ?? throw new ArgumentNullException(nameof(settings));
 }
 public IgnoreOperationMiddleware(RequestDelegate next, AutumnSettings settings)
 {
     _next     = next;
     _settings = settings;
 }