/// <summary> /// Get file content /// </summary> public string GetFileContent() { var propertyStrings = new List <string>(); if (FormField.Property.FilterExpression != null) { var expressionPartial = new CsExpressionPartial(FormField.Property, FormField.Property.FilterExpression); var properties = expressionPartial.GetFilterProperties(); foreach (var property in properties) { propertyStrings.Add(ModelReferenceItemPropertyTemplate.Evaluate(property)); } } return($@"using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using MongoDB.Bson; using Oven.Shared; namespace {Project.InternalName}.Models.{Screen.InternalName}.Reference {{ /// <summary> /// {FormField.TitleValue} Reference Request /// </summary> public class {FormField.ReferenceRequestClass} {{ /// <summary> /// Page /// </summary> [Required] [DefaultValue(1)] public int Page {{ get; set; }} /// <summary> /// Page Size /// </summary> [Required] [DefaultValue(10)] public int PageSize {{ get; set; }} /// <summary> /// Query /// </summary> public string Query {{ get; set; }}{(propertyStrings.Any() ? Environment.NewLine : string.Empty)}{string.Join(Environment.NewLine, propertyStrings)} }} }}"); }
/// <summary> /// Evaluate /// </summary> internal static string Evaluate(Project project, Screen screen, FormField formField) { var entity = project.Entities.SingleOrDefault(e => e.Id == formField.Property.ReferenceEntityId); var itemClassName = $"Models.{screen.InternalName}.Reference.{formField.ReferenceItemClass}"; var responseClassName = $"Models.{screen.InternalName}.Reference.{formField.ReferenceResponseClass}"; var requestClassName = $"Models.{screen.InternalName}.Reference.{formField.ReferenceRequestClass}"; // TODO: this url needs to be formField specific var whereString = $@"where request.Query == null || request.Query == """" || item.Title.Contains(request.Query)"; if (formField.Property.FilterExpression != null) { var expressionPartial = new CsExpressionPartial(formField.Property, formField.Property.FilterExpression); var expression = expressionPartial.GetExpression("item", "request"); whereString = $@"where ({expression}) && (request.Query == null || request.Query == """" || item.Title.Contains(request.Query))"; } return($@" /// <summary> /// {formField.TitleValue} Reference Search /// </summary> [HttpPost(""{formField.Property.InternalName}References"")] [ProducesResponseType(typeof({responseClassName}), 200)] [ProducesResponseType(typeof(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary), 400)] public async Task<IActionResult> {formField.Property.InternalName}Reference([FromServices] I{screen.Entity.InternalName}Service {screen.Entity.InternalName.Camelize()}Service, [FromBody]{requestClassName} request) {{ if (request == null) {{ return BadRequest(); }} if (!ModelState.IsValid) {{ return new BadRequestObjectResult(ModelState); }} var query = from item in _context.{entity.InternalNamePlural} {whereString} select new {{ item.Id, item.Title }}; var totalItems = query.Count(); int totalPages = 0; var items = new {itemClassName}[0]; if (totalItems != 0 && request.PageSize != 0) {{ totalPages = Convert.ToInt32(Math.Ceiling((double)totalItems / request.PageSize)); var dbItems = await query .OrderBy(p => p.Title) //TODO: From Setting .Skip((request.Page - 1) * request.PageSize) .Take(request.PageSize) .ToArrayAsync(); // had to do the select outside EF as it was having issues with the AnonymousType items = dbItems .Select(item => new {itemClassName} {{ Id = item.Id, Title = item.Title }}) .ToArray(); }} var result = new {responseClassName} {{ TotalItems = totalItems, TotalPages = totalPages, Items = items }}; return Ok(result); }}"); }