Beispiel #1
0
        /// <summary>
        /// This is needed in both the generic and specific controllers, so we move it out here
        /// </summary>
        public static Query <Document> SearchImpl(Query <Document> query, GetArguments args, IEnumerable <AbstractPermission> filteredPermissions)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                // TODO:
                // IF the search starts with the serial prefix (case insensitive) then search the serial numbers exclusively

                // ELSE: search the memo etc normally
                var memo         = nameof(Document.Memo);
                var serialNumber = nameof(Document.SerialNumber);
                var filterString = $"{memo} {Ops.contains} '{search}'";

                // If the search is a number, include the result with that serial number
                if (int.TryParse(search.Trim(), out int searchNumber))
                {
                    filterString = $"{filterString} or {serialNumber} eq {searchNumber}";
                }

                query = query.Filter(FilterExpression.Parse(filterString));
            }

            return(query);
        }
Beispiel #2
0
        protected override Query <InboxRecord> Search(Query <InboxRecord> query, GetArguments args)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var createdByProp = nameof(InboxRecord.CreatedBy);
                var nameProp      = $"{createdByProp}.{nameof(User.Name)}";
                var name2Prop     = $"{createdByProp}.{nameof(User.Name2)}";
                var name3Prop     = $"{createdByProp}.{nameof(User.Name3)}";

                var commentProp = nameof(InboxRecord.Comment);
                var memoProp    = $"{nameof(InboxRecord.Document)}.{nameof(Document.Memo)}";

                // Prepare the filter string
                var filterString = $"{nameProp} contains '{search}' or {name2Prop} contains '{search}' or {name3Prop} contains '{search}' or {commentProp} contains '{search}' or {memoProp} contains '{search}'";

                // Apply the filter
                query = query.Filter(ExpressionFilter.Parse(filterString));
            }

            return(query);
        }
Beispiel #3
0
        protected override Query <ExchangeRate> Search(Query <ExchangeRate> query, GetArguments args)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var currencyProp = nameof(ExchangeRate.Currency);
                var idProp       = $"{currencyProp}.{nameof(Currency.Id)}";
                var nameProp     = $"{currencyProp}.{nameof(Currency.Name)}";
                var name2Prop    = $"{currencyProp}.{nameof(Currency.Name2)}";
                var name3Prop    = $"{currencyProp}.{nameof(Currency.Name3)}";
                var descProp     = $"{currencyProp}.{nameof(Currency.Description)}";
                var desc2Prop    = $"{currencyProp}.{nameof(Currency.Description2)}";
                var desc3Prop    = $"{currencyProp}.{nameof(Currency.Description3)}";

                // Prepare the filter string
                var filterString = $"{idProp} contains '{search}' or {nameProp} contains '{search}' or {name2Prop} contains '{search}' or {name3Prop} contains '{search}' or {descProp} contains '{search}' or {desc2Prop} contains '{search}' or {desc3Prop} contains '{search}'";

                // If the search is a date, include documents with that date
                if (DateTime.TryParse(search.Trim(), out DateTime searchDate))
                {
                    var validAsOfProp = nameof(ExchangeRate.ValidAsOf);
                    filterString = $"{filterString} or {validAsOfProp} eq {searchDate:yyyy-MM-dd}";
                }

                // Apply the filter
                query = query.Filter(ExpressionFilter.Parse(filterString));
            }

            return(query);
        }
        protected async Task <IActionResult> GetAsync <TModel>(GetArguments <TEntity, TModel> arguments)
        {
            var query = this.context.Set <TEntity>()
                        .AsNoTracking();

            if (this.DefaultPredicate != null)
            {
                query = query.Where(this.DefaultPredicate);
            }

            if (typeof(DAL.IHasSoftDelete).IsAssignableFrom(typeof(TEntity)))
            {
                query = query.Cast <DAL.IHasSoftDelete>().Where(x => !x.IsDeleted).Cast <TEntity>();
            }

            if (arguments.Predicate != null)
            {
                query = query.Where(arguments.Predicate);
            }

            var model = await query
                        .Select(arguments.Selector)
                        .SingleOrDefaultAsync();

            if (model == null)
            {
                return(this.NotFound());
            }

            return(this.Ok(model));
        }
Beispiel #5
0
        public virtual async Task <ActionResult <GetFactResponse> > GetFact([FromQuery] GetArguments args, CancellationToken cancellation)
        {
            return(await ControllerUtilities.InvokeActionImpl(async() =>
            {
                using var _ = _instrumentation.Block("Controller GetFact");

                // Calculate server time at the very beginning for consistency
                var serverTime = DateTimeOffset.UtcNow;

                // Retrieves the raw data from the database, unflattend, untrimmed
                var service = GetFactService();
                var(data, isPartial, count) = await service.GetFact(args, cancellation);

                // Prepare the result in a response object
                var result = new GetFactResponse
                {
                    IsPartial = isPartial,
                    ServerTime = serverTime,
                    Result = data,
                    TotalCount = count
                };

                return Ok(result);
            }, _logger));
        }
Beispiel #6
0
            public async Task Get(GetArguments arguments)
            {
                var(app, service) = Configuration.GetClient();

                var schemasClient = service.CreateSchemasClient();
                var schema        = await schemasClient.GetSchemaAsync(app, arguments.Name);

                Console.WriteLine(schema.JsonPrettyString());
            }
        protected override Query <SummaryEntry> Search(Query <SummaryEntry> query, GetArguments args, IEnumerable <AbstractPermission> filteredPermissions)
        {
            //string search = args.Search;
            //if (!string.IsNullOrWhiteSpace(search))
            //{
            //    search = search.Replace("'", "''"); // escape quotes by repeating them

            //    var name = nameof(SummaryEntry.Name);

            //    query = query.Filter($"{name} {Ops.contains} '{search}'");
            //}

            return(query);
        }
Beispiel #8
0
        public void ShouldGetArgumentsOfInvokedMethod()
        {
            MockFactory            mocks       = new MockFactory();
            string                 message     = "hello";
            Mock <IMessageService> serviceMock = mocks.CreateMock <IMessageService>();

            MessageController controller = new MessageController(serviceMock.MockObject);

            serviceMock.Expects.One.Method(_ => _.GetMessage(0, null)).With(Is.EqualTo(23), Is.Anything)
            .Will(GetArguments.WhenCalled(arguments => (arguments[1] as Action <string>).Invoke(message)));

            controller.GetMessage(23);

            Assert.AreEqual(message, controller.Message);
        }
Beispiel #9
0
        protected override Query <LegacyType> Search(Query <LegacyType> query, GetArguments args, IEnumerable <AbstractPermission> filteredPermissions)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var name  = nameof(LegacyType.Name);
                var name2 = nameof(LegacyType.Name2);
                var name3 = nameof(LegacyType.Name3);

                query = query.Filter($"{name} {Ops.contains} '{search}' or {name2} {Ops.contains} '{search}' or {name3} {Ops.contains} '{search}'");
            }

            return(query);
        }
Beispiel #10
0
        protected override Query <DetailsEntry> Search(Query <DetailsEntry> query, GetArguments args)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var line  = nameof(DetailsEntry.Line);
                var memo  = nameof(LineForQuery.Memo);
                var text1 = nameof(LineForQuery.Text1);

                var filterString = $"{line}.{memo} contains '{search}' or {line}.{text1} contains '{search}' ";
                query = query.Filter(ExpressionFilter.Parse(filterString));
            }

            return(query);
        }
Beispiel #11
0
        protected override Query <EntryType> Search(Query <EntryType> query, GetArguments args)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var name  = nameof(EntryType.Name);
                var name2 = nameof(EntryType.Name2);
                var name3 = nameof(EntryType.Name3);
                var code  = nameof(EntryType.Code);

                query = query.Filter($"{name} contains '{search}' or {name2} contains '{search}' or {name3} contains '{search}' or {code} contains '{search}'");
            }

            return(query);
        }
Beispiel #12
0
        /// <summary>
        /// This is needed in both the generic and specific controllers, so we move it out here
        /// </summary>
        public static Query <Resource> SearchImpl(Query <Resource> query, GetArguments args, IEnumerable <AbstractPermission> _)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var name  = nameof(Resource.Name);
                var name2 = nameof(Resource.Name2);
                var name3 = nameof(Resource.Name3);
                var code  = nameof(Resource.Code);

                query = query.Filter($"{name} {Ops.contains} '{search}' or {name2} {Ops.contains} '{search}' or {name3} {Ops.contains} '{search}' or {code} {Ops.contains} '{search}'");
            }

            return(query);
        }
Beispiel #13
0
        protected override Query <Agent> Search(Query <Agent> query, GetArguments args)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var name  = nameof(Agent.Name);
                var name2 = nameof(Agent.Name2);
                var name3 = nameof(Agent.Name3);

                var filterString = $"{name} contains '{search}' or {name2} contains '{search}' or {name3} contains '{search}'";
                query = query.Filter(ExpressionFilter.Parse(filterString));
            }

            return(query);
        }
Beispiel #14
0
        /// <summary>
        /// This is needed in both the generic and specific controllers, so we move it out here
        /// </summary>
        public static Query <Resource> SearchImpl(Query <Resource> query, GetArguments args)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var name       = nameof(Resource.Name);
                var name2      = nameof(Resource.Name2);
                var name3      = nameof(Resource.Name3);
                var code       = nameof(Resource.Code);
                var identifier = nameof(Resource.Identifier);

                query = query.Filter($"{name} contains '{search}' or {name2} contains '{search}' or {name3} contains '{search}' or {code} contains '{search}' or {identifier} contains '{search}'");
            }

            return(query);
        }
Beispiel #15
0
        /// <summary>
        /// This is needed in both the generic and specific controllers, so we move it out here
        /// </summary>
        public static Query <Agent> SearchImpl(Query <Agent> query, GetArguments args, IEnumerable <AbstractPermission> filteredPermissions)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var name  = nameof(Agent.Name);
                var name2 = nameof(Agent.Name2);
                var name3 = nameof(Agent.Name3);
                var code  = nameof(Agent.Code);

                var filterString = $"{name} {Ops.contains} '{search}' or {name2} {Ops.contains} '{search}' or {name3} {Ops.contains} '{search}' or {code} {Ops.contains} '{search}'";
                query = query.Filter(FilterExpression.Parse(filterString));
            }

            return(query);
        }
Beispiel #16
0
        /// <summary>
        /// This is needed in both the generic and specific controllers, so we move it out here
        /// </summary>
        public static Query <Custody> SearchImpl(Query <Custody> query, GetArguments args)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var name  = nameof(Custody.Name);
                var name2 = nameof(Custody.Name2);
                var name3 = nameof(Custody.Name3);
                var code  = nameof(Custody.Code);

                var filterString = $"{name} contains '{search}' or {name2} contains '{search}' or {name3} contains '{search}' or {code} contains '{search}'";
                query = query.Filter(ExpressionFilter.Parse(filterString));
            }

            return(query);
        }
Beispiel #17
0
            public async Task Get(GetArguments arguments)
            {
                var session = configuration.StartSession();

                var schema = await session.Schemas.GetSchemaAsync(session.App, arguments.Name);

                if (arguments.WithReferencedNames)
                {
                    var allSchemas = await session.Schemas.GetSchemasAsync(session.App);

                    var result = new SchemaWithRefs <SchemaDto>(schema).EnrichSchemaNames(allSchemas.Items);

                    log.WriteLine(result.JsonPrettyString());
                }
                else
                {
                    log.WriteLine(schema.JsonPrettyString());
                }
            }
            public async Task Get(GetArguments arguments)
            {
                var(app, service) = Configuration.GetClient();

                var schemasClient = service.CreateSchemasClient();
                var schema        = await schemasClient.GetSchemaAsync(app, arguments.Name);

                if (arguments.WithReferencedNames)
                {
                    var allSchemas = await schemasClient.GetSchemasAsync(app);

                    var result = new SchemaWithRefs <SchemaDetailsDto>(schema).EnrichSchemaNames(allSchemas);

                    Console.WriteLine(result.JsonPrettyString());
                }
                else
                {
                    Console.WriteLine(schema.JsonPrettyString());
                }
            }
Beispiel #19
0
        protected override Query <EmailForQuery> Search(Query <EmailForQuery> query, GetArguments args)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var toEmail = nameof(EmailForQuery.ToEmail);
                var subject = nameof(EmailForQuery.Subject);

                // Prepare the filter string
                var filterString = $"{toEmail} contains '{search}' or {subject} contains '{search}'";

                // Apply the filter
                query = query.Filter(ExpressionFilter.Parse(filterString));
            }

            return(query);
        }
Beispiel #20
0
        protected override Query <IfrsConcept> Search(Query <IfrsConcept> query, GetArguments args)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var labelProp  = nameof(IfrsConcept.Label);
                var label2Prop = nameof(IfrsConcept.Label2);
                var label3Prop = nameof(IfrsConcept.Label3);

                // Prepare the filter string
                var filterString = $"{labelProp} contains '{search}' or {label2Prop} contains '{search}' or {label3Prop} contains '{search}'";

                // Apply the filter
                query = query.Filter(ExpressionFilter.Parse(filterString));
            }

            return(query);
        }
Beispiel #21
0
        protected override Query <Currency> Search(Query <Currency> query, GetArguments args, IEnumerable <AbstractPermission> filteredPermissions)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var name  = nameof(Currency.Name);
                var name2 = nameof(Currency.Name2);
                var name3 = nameof(Currency.Name3);
                var desc  = nameof(Currency.Description);
                var desc2 = nameof(Currency.Description2);
                var desc3 = nameof(Currency.Description3);

                var filterString = $"{name} {Ops.contains} '{search}' or {name2} {Ops.contains} '{search}' or {name3} {Ops.contains} '{search}' or {desc} {Ops.contains} '{search}' or {desc2} {Ops.contains} '{search}' or {desc3} {Ops.contains} '{search}'";
                query = query.Filter(FilterExpression.Parse(filterString));
            }

            return(query);
        }
Beispiel #22
0
        protected override Query <Currency> Search(Query <Currency> query, GetArguments args)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var id    = nameof(Currency.Id);
                var name  = nameof(Currency.Name);
                var name2 = nameof(Currency.Name2);
                var name3 = nameof(Currency.Name3);
                var desc  = nameof(Currency.Description);
                var desc2 = nameof(Currency.Description2);
                var desc3 = nameof(Currency.Description3);

                var filterString = $"{id} contains '{search}' or {name} contains '{search}' or {name2} contains '{search}' or {name3} contains '{search}' or {desc} contains '{search}' or {desc2} contains '{search}' or {desc3} contains '{search}'";
                query = query.Filter(ExpressionFilter.Parse(filterString));
            }

            return(query);
        }
Beispiel #23
0
        // Endpoint implementations

        /// <summary>
        /// Returns the entities as per the specifications in the get request
        /// </summary>
        protected virtual async Task <GetResponse <TEntity> > GetImplAsync(GetArguments args, Query <TEntity> queryOverride = null)
        {
            // Parse the parameters
            var filter  = FilterExpression.Parse(args.Filter);
            var orderby = OrderByExpression.Parse(args.OrderBy);
            var expand  = ExpandExpression.Parse(args.Expand);
            var select  = SelectExpression.Parse(args.Select);

            // Prepare the query
            var query = queryOverride ?? GetRepository().Query <TEntity>();

            // Retrieve the user permissions for the current view
            var permissions = await UserPermissions(Constants.Read);

            // Filter out permissions with masks that would be violated by the filter or order by arguments
            var defaultMask = GetDefaultMask() ?? new MaskTree();

            permissions = FilterViolatedPermissionsForFlatQuery(permissions, defaultMask, filter, orderby);

            // Apply read permissions
            var permissionsFilter = GetReadPermissionsCriteria(permissions);

            query = query.Filter(permissionsFilter);

            // Search
            query = Search(query, args, permissions);

            // Filter
            query = query.Filter(filter);

            // Before ordering or paging, retrieve the total count
            int totalCount = await query.CountAsync();

            // OrderBy
            query = OrderBy(query, orderby);

            // Apply the paging (Protect against DOS attacks by enforcing a maximum page size)
            var top  = args.Top;
            var skip = args.Skip;

            top   = Math.Min(top, MaximumPageSize());
            query = query.Skip(skip).Top(top);

            // Apply the expand, which has the general format 'Expand=A,B/C,D'
            var expandedQuery = query.Expand(expand);

            // Apply the select, which has the general format 'Select=A,B/C,D'
            expandedQuery = expandedQuery.Select(select);

            // Load the data in memory
            var result = await expandedQuery.ToListAsync();

            // Apply the permission masks (setting restricted fields to null) and adjust the metadata accordingly
            await ApplyReadPermissionsMask(result, query, permissions, defaultMask);

            // Flatten and Trim
            var relatedEntities = FlattenAndTrim(result, expand);

            // Prepare the result in a response object
            return(new GetResponse <TEntity>
            {
                Skip = skip,
                Top = result.Count(),
                OrderBy = args.OrderBy,
                TotalCount = totalCount,

                Result = result,
                RelatedEntities = relatedEntities,
                CollectionName = GetCollectionName(typeof(TEntity))
            });
        }
Beispiel #24
0
 public virtual async Task <ActionResult <GetResponse <TEntity> > > Get([FromQuery] GetArguments args)
 {
     return(await GetInnerAsync(args));
 }
Beispiel #25
0
 protected virtual async Task <ActionResult <GetResponse <TEntity> > > GetInnerAsync(GetArguments args, Query <TEntity> queryOverride = null)
 {
     return(await ControllerUtilities.InvokeActionImpl(async() =>
     {
         var result = await GetImplAsync(args, queryOverride);
         return Ok(result);
     }, _logger));
 }
Beispiel #26
0
 /// <summary>
 /// Applies the search argument, which is handled differently in every controller
 /// </summary>
 protected abstract Query <TEntity> Search(Query <TEntity> query, GetArguments args, IEnumerable <AbstractPermission> filteredPermissions);
        protected override Task <EntityQuery <MessageCommand> > Search(EntityQuery <MessageCommand> query, GetArguments args, CancellationToken _)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                // Prepare the filter string
                var caption      = nameof(MessageCommand.Caption);
                var filterString = $"{caption} contains '{search}'";

                // Apply the filter
                query = query.Filter(filterString);
            }

            return(Task.FromResult(query));
        }
Beispiel #28
0
        protected override Query <RelationDefinition> Search(Query <RelationDefinition> query, GetArguments args)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                var titleP  = nameof(RelationDefinition.TitlePlural);
                var titleP2 = nameof(RelationDefinition.TitlePlural2);
                var titleP3 = nameof(RelationDefinition.TitlePlural3);

                var titleS  = nameof(RelationDefinition.TitleSingular);
                var titleS2 = nameof(RelationDefinition.TitleSingular2);
                var titleS3 = nameof(RelationDefinition.TitleSingular3);
                var code    = nameof(RelationDefinition.Code);

                query = query.Filter($"{titleS} contains '{search}' or {titleS2} contains '{search}' or {titleS3} contains '{search}' or {titleP} contains '{search}' or {titleP2} contains '{search}' or {titleP3} contains '{search}' or {code} contains '{search}'");
            }

            return(query);
        }
Beispiel #29
0
 protected override Query <DetailsEntry> Search(Query <DetailsEntry> query, GetArguments args, IEnumerable <AbstractPermission> filteredPermissions)
 {
     return(query);
 }
Beispiel #30
0
        protected override Query <SmsMessageForQuery> Search(Query <SmsMessageForQuery> query, GetArguments args)
        {
            string search = args.Search;

            if (!string.IsNullOrWhiteSpace(search))
            {
                search = search.Replace("'", "''"); // escape quotes by repeating them

                // Prepare the filter string
                var message      = nameof(SmsMessageForQuery.Message);
                var filterString = $"{message} contains '{search}'";

                // If the search term looks like a phone number, include the contact mobile in the search
                if (phoneAtt.IsValid(search))
                {
                    var e164    = ControllerUtilities.ToE164(search);
                    var toPhone = nameof(SmsMessageForQuery.ToPhoneNumber);

                    filterString += $" or {toPhone} startsw '{e164}'";
                }

                // Apply the filter
                query = query.Filter(filterString);
            }

            return(query);
        }