private (string Cut, string Singular, string Plural) GetActionGroup(AppNode action, Pluralizer pluralizer = null) { pluralizer = pluralizer ?? new Pluralizer(); switch (action.NodeType) { case AppNodeType.Query: case AppNodeType.ListQuery: var cut = GetQueryBaseName(action, trimGet: true, trimList: true); return(cut, pluralizer.Singularize(cut), pluralizer.Pluralize(cut)); case AppNodeType.BoolQuery: // Is... supposed form: Question + Entity + Adjectives // others supposed form: Question + Action + Entity cut = string.Join("", action.NameWords.Skip(2)); return(cut, pluralizer.Singularize(cut), pluralizer.Pluralize(cut)); case AppNodeType.Command: case AppNodeType.InsertCommand: case AppNodeType.UpdateCommand: case AppNodeType.DeleteCommand: // supposed form: Action + Entity cut = string.Join("", action.NameWords.Skip(1)); return(cut, pluralizer.Singularize(cut), pluralizer.Pluralize(cut)); default: return(null, null, null); } }
private IDictionary <string, string> GenerateControllers(AppNode domainNode, IDictionary <ResourceTemplateType, ResourceTemplate> templates) { var result = new Dictionary <string, string>(); var subDomains = domainNode.FindSubDomains(); if (subDomains.Any()) { // multidomain mode foreach (var subDomain in subDomains) { var template = GetControllerTemplate(templates, subDomain, domainNode); var path = $"{domainNode.Name}/{subDomain.Name}Controller.cs"; result[path] = template.GetReplacedContent(); } } else { // single domain mode var template = GetControllerTemplate(templates, domainNode); var path = $"{domainNode.Name}/{domainNode.Name}Controller.cs"; result[path] = template.GetReplacedContent(); } return(result); }
private static string GetDtoPlaceholder(AppNode queryNode) { var dtoPlaceholder = GetQueryBaseName(queryNode, trimList: true); dtoPlaceholder = new Pluralizer().Singularize(dtoPlaceholder); dtoPlaceholder = $"{dtoPlaceholder}Dto"; return(dtoPlaceholder); }
private static string GetQueryRoutePlaceholder(AppNode node, string domainPlural, string domainSingular) { var baseName = GetQueryBaseName(node, trimGet: true); var words = baseName.SplitIntoWords() .Select(w => w == domainPlural || w == domainSingular ? "/" : $"{w.ToLower()}-"); return(CleanRoutePlaceholder(words)); }
private string GetQueryApiUrl(AppNode queryNode) { var domain = queryNode.GetDomainName(); var pluralizer = new Pluralizer(); var route = GetQueryRoutePlaceholder(queryNode, pluralizer.Pluralize(domain), pluralizer.Singularize(domain)); var suffix = queryNode.IsListQuery ? "" : "1"; var url = $"{_config.ApiUrlPrefix}/{domain.ToLower()}/{route}/{suffix}" .TrimEnd('/') .Replace("//", "/"); return(url); }
private static string GetQueryBaseName(AppNode queryNode, bool trimGet = true, bool trimList = false) { var trim = queryNode.Name; trim = trimGet && trim.StartsWith("Get") ? trim.Substring("Get".Length) : trim; trim = trimList && trim.EndsWith("List") ? trim.Substring(0, trim.Length - "List".Length) : trim; return(trim); }
private static string GetCommandRoutePlaceholder(AppNode node, string domainPlural, string domainSingular) { var baseName = node.Name; var words = baseName.SplitIntoWords(); var parts = words.Skip(1) .Select(w => w == domainPlural || w == domainSingular ? "/" : $"{w.ToLower()}-") .ToList(); parts.Add("/"); parts.Add(words[0].ToLower()); return(CleanRoutePlaceholder(parts)); }
private string AddDetailHandlerTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, Dictionary <string, string> result, AppNode queryNode) { var path = $"{queryNode.GetFullPath()}/{queryNode.Name}QueryHandler.cs"; var template = GetDetailHandlerTemplate(templates, queryNode); result[path] = template.GetReplacedContent(); return(path); }
private ResourceTemplate GetQueryIntegrationTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, AppNode queryNode) { var template = templates[ResourceTemplateType.IntegrationTestQuery]; template.ResetParameters(); var urlPlaceholder = GetQueryApiUrl(queryNode); var appNsPlaceholder = $"{_config.Namespace}.{_config.AppSuffix}"; var webNsPlaceholder = $"{_config.Namespace}.{_config.UiSuffix}"; var queryNsPlaceholder = $"{appNsPlaceholder}.{queryNode.GetFullPath(".")}"; var queriesNsPlaceholder = $"{appNsPlaceholder}.{queryNode.Parent.GetFullPath(".")}"; var namespacePlaceholder = $"{webNsPlaceholder}.IntegrationTests.Controllers.{queryNode.GetDomainName()}"; var vmPlaceholder = $"{GetQueryBaseName(queryNode, trimGet: true)}Vm"; template.SetParameter(TemplateParameterType.QueryNsPlaceholder, queryNsPlaceholder); template.SetParameter(TemplateParameterType.QueriesNsPlaceholder, queriesNsPlaceholder); template.SetParameter(TemplateParameterType.WebNsPlaceholder, webNsPlaceholder); template.SetParameter(TemplateParameterType.NamespacePlaceholder, namespacePlaceholder); template.SetParameter(TemplateParameterType.QueryPlaceholder, queryNode.Name);// special case here without "Query" suffix template.SetParameter(TemplateParameterType.FixturePlaceholder, $"{queryNode.Name}QueryTests"); template.SetParameter(TemplateParameterType.VmPlaceholder, vmPlaceholder); template.SetParameter(TemplateParameterType.UrlPlaceholder, urlPlaceholder); return(template); }
private string AddQueryIntegrationTestTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, Dictionary <string, string> result, AppNode queryNode) { var path = $"Controllers/{queryNode.Parent.GetFullPath()}/{queryNode.Name}QueryIntegrationTest.cs"; var template = GetQueryIntegrationTemplate(templates, queryNode); result[path] = template.GetReplacedContent(); return(path); }
private ResourceTemplate GetQueryTestTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, AppNode queryNode) { var template = templates[ResourceTemplateType.UnitTestQuery]; template.ResetParameters(); var appNsPlaceholder = $"{_config.Namespace}.{_config.AppSuffix}"; var persistNsPlaceholder = $"{_config.Namespace}.Persistence"; var queryNsPlaceholder = $"{appNsPlaceholder}.{queryNode.GetFullPath(".")}"; var namespacePlaceholder = $"{appNsPlaceholder}.UnitTests.{queryNode.Parent.GetFullPath(".")}"; var vmPlaceholder = $"{GetQueryBaseName(queryNode, trimGet: true)}Vm"; template.SetParameter(TemplateParameterType.QueryNsPlaceholder, queryNsPlaceholder); template.SetParameter(TemplateParameterType.ApplicationNsPlaceholder, appNsPlaceholder); template.SetParameter(TemplateParameterType.NamespacePlaceholder, namespacePlaceholder); template.SetParameter(TemplateParameterType.PersistenceNsPlaceholder, persistNsPlaceholder); template.SetParameter(TemplateParameterType.QueryPlaceholder, queryNode.Name);// special case here without "Query" suffix template.SetParameter(TemplateParameterType.FixturePlaceholder, $"{queryNode.Name}QueryTests"); template.SetParameter(TemplateParameterType.HandlerPlaceholder, $"{queryNode.Name}QueryHandler"); template.SetParameter(TemplateParameterType.DbContextPlaceholder, GetQueryTestDbContext(_config.DbContext)); template.SetParameter(TemplateParameterType.VmPlaceholder, vmPlaceholder); return(template); }
private string GetActionsPlaceholder(IDictionary <ResourceTemplateType, ResourceTemplate> templates, AppNode domainNode) { var pluralizer = new Pluralizer(); var singular = pluralizer.Singularize(domainNode.Name); var plural = pluralizer.Pluralize(domainNode.Name); var actions = domainNode.FindCommands() .Union(domainNode.FindQueries()) .Select(c => { var group = GetActionGroup(c, pluralizer); return(new ControllerActionGroup { Node = c, Cut = group.Cut, Sort = group.Plural.Replace(plural, ""), Singular = group.Singular, Plural = group.Plural, DomainSingular = singular, DomainPlural = plural }); }) .GroupBy(a => a.Plural) // treat entity with domain name as primary .OrderBy(g => g.Key.Replace(plural, "")); var sb = new StringBuilder(); foreach (var actionGroup in actions) { foreach (var action in actionGroup.OrderBy(a => a.Node.IsCommand).ThenBy(a => a.Node.Name)) { var template = GetActionTemplate(templates, action); sb.Append(template.GetReplacedContent()); } } return(sb.ToString()); }
private ResourceTemplate GetControllerTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, AppNode domainNode, AppNode subdomainNode = null) { var template = templates[ResourceTemplateType.WebController]; template.ResetParameters(); var workNode = subdomainNode ?? domainNode; var queries = workNode.FindQueries(); var commands = workNode.FindCommands(); var queriesNsPlaceholder = GetUsingsPlaceholder(queries); var commandsNsPlaceholder = GetUsingsPlaceholder(commands); var webNsPlaceholder = $"{_config.Namespace}.{_config.UiSuffix}"; var namespacePlaceholder = $"{webNsPlaceholder}.Controllers.{domainNode.Name}"; var controllerPlaceholder = $"{workNode.Name}Controller"; var actionsPlaceholder = GetActionsPlaceholder(templates, workNode); template.SetParameter(TemplateParameterType.CommandsNsPlaceholder, commandsNsPlaceholder); template.SetParameter(TemplateParameterType.QueriesNsPlaceholder, queriesNsPlaceholder); template.SetParameter(TemplateParameterType.WebNsPlaceholder, webNsPlaceholder); template.SetParameter(TemplateParameterType.NamespacePlaceholder, namespacePlaceholder); template.SetParameter(TemplateParameterType.ControllerPlaceholder, controllerPlaceholder); template.SetParameter(TemplateParameterType.ActionsPlaceholder, actionsPlaceholder); return(template); }
private string[] AddEventTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, Dictionary <string, string> result, AppNode cmdNode) { if (cmdNode.Name.StartsWith("upsert", StringComparison.OrdinalIgnoreCase)) { var cmdBase = cmdNode.Name.Substring("upsert".Length); var eventCreated = GetEventName("Create" + cmdBase); var createdPath = $"{cmdNode.GetFullPath()}/{eventCreated}.cs"; var createdTemplate = GetEventTemplate(templates, cmdNode, eventCreated); result[createdPath] = createdTemplate.GetReplacedContent(); var eventUpdated = GetEventName("Update" + cmdBase); var updatedPath = $"{cmdNode.GetFullPath()}/{eventUpdated}.cs"; var updatedTemplate = GetEventTemplate(templates, cmdNode, eventUpdated); result[updatedPath] = updatedTemplate.GetReplacedContent(); return(new[] { createdPath, updatedPath }); } else { var eventName = GetEventName(cmdNode.Name); var path = $"{cmdNode.GetFullPath()}/{eventName}.cs"; var template = GetEventTemplate(templates, cmdNode, eventName); result[path] = template.GetReplacedContent(); return(new[] { path }); } }
private string AddCommandHandlerTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, Dictionary <string, string> result, AppNode cmdNode) { var path = $"{cmdNode.GetFullPath()}/{cmdNode.Name}CommandHandler.cs"; var template = GetCommandHandlerTemplate(templates, cmdNode); result[path] = template.GetReplacedContent(); return(path); }
private ResourceTemplate GetCommandTestTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, AppNode cmdNode) { var template = templates[ResourceTemplateType.UnitTestCommand]; template.ResetParameters(); var appNsPlaceholder = $"{_config.Namespace}.{_config.AppSuffix}"; var namespacePlaceholder = $"{appNsPlaceholder}.UnitTests.{cmdNode.Parent.GetFullPath(".")}"; var commandNsPlaceholder = $"{appNsPlaceholder}.{cmdNode.GetFullPath(".")}"; template.SetParameter(TemplateParameterType.CommandNsPlaceholder, commandNsPlaceholder); template.SetParameter(TemplateParameterType.ApplicationNsPlaceholder, appNsPlaceholder); template.SetParameter(TemplateParameterType.NamespacePlaceholder, namespacePlaceholder); template.SetParameter(TemplateParameterType.CommandPlaceholder, $"{cmdNode.Name}Command"); template.SetParameter(TemplateParameterType.FixturePlaceholder, $"{cmdNode.Name}CommandTests"); template.SetParameter(TemplateParameterType.HandlerPlaceholder, $"{cmdNode.Name}CommandHandler"); return(template); }
private ResourceTemplate GetQueryTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, AppNode queryNode) { var template = templates[ResourceTemplateType.AppQuery]; template.ResetParameters(); var namespacePlaceholder = $"{_config.Namespace}.{_config.AppSuffix}.{queryNode.GetFullPath(".")}"; var queryPlaceholder = $"{queryNode.Name}Query"; var vmPlaceholder = $"{GetQueryBaseName(queryNode, trimGet: true)}Vm"; template.SetParameter(TemplateParameterType.NamespacePlaceholder, namespacePlaceholder); template.SetParameter(TemplateParameterType.QueryPlaceholder, queryPlaceholder); template.SetParameter(TemplateParameterType.VmPlaceholder, vmPlaceholder); return(template); }
private ResourceTemplate GetQueryValidatorTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, AppNode queryNode) { var template = templates[ResourceTemplateType.AppQueryValidator]; template.ResetParameters(); var namespacePlaceholder = $"{_config.Namespace}.{_config.AppSuffix}.{queryNode.GetFullPath(".")}"; var queryPlaceholder = $"{queryNode.Name}Query"; var validatorPlaceholder = $"{queryNode.Name}QueryValidator"; template.SetParameter(TemplateParameterType.NamespacePlaceholder, namespacePlaceholder); template.SetParameter(TemplateParameterType.QueryPlaceholder, queryPlaceholder); template.SetParameter(TemplateParameterType.ValidatorPlaceholder, validatorPlaceholder); return(template); }
private ResourceTemplate GetDtoTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, AppNode queryNode) { var template = templates[ResourceTemplateType.AppListDto]; template.ResetParameters(); var appNsPlaceholder = $"{_config.Namespace}.{_config.AppSuffix}"; var domainNsPlaceholder = $"{_config.Namespace}.Domain"; var namespacePlaceholder = $"{appNsPlaceholder}.{queryNode.GetFullPath(".")}"; var dtoPlaceholder = GetDtoPlaceholder(queryNode); template.SetParameter(TemplateParameterType.ApplicationNsPlaceholder, appNsPlaceholder); template.SetParameter(TemplateParameterType.DomainNsPlaceholder, domainNsPlaceholder); template.SetParameter(TemplateParameterType.NamespacePlaceholder, namespacePlaceholder); template.SetParameter(TemplateParameterType.DtoPlaceholder, dtoPlaceholder); return(template); }
private string AddDtoTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, Dictionary <string, string> result, AppNode queryNode) { var dto = GetDtoPlaceholder(queryNode); var path = $"{queryNode.GetFullPath()}/{dto}.cs"; var template = GetDtoTemplate(templates, queryNode); result[path] = template.GetReplacedContent(); return(path); }
private ResourceTemplate GetCommandValidatorTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, AppNode cmdNode) { var template = templates[ResourceTemplateType.AppValidator]; template.ResetParameters(); var namespacePlaceholder = $"{_config.Namespace}.{_config.AppSuffix}.{cmdNode.GetFullPath(".")}"; template.SetParameter(TemplateParameterType.CommandPlaceholder, $"{cmdNode.Name}Command"); template.SetParameter(TemplateParameterType.NamespacePlaceholder, namespacePlaceholder); template.SetParameter(TemplateParameterType.ValidatorPlaceholder, $"{cmdNode.Name}CommandValidator"); return(template); }
private ResourceTemplate GetDetailHandlerTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, AppNode queryNode) { var template = templates[ResourceTemplateType.AppDetailHandler]; template.ResetParameters(); var appNsPlaceholder = $"{_config.Namespace}.{_config.AppSuffix}"; var namespacePlaceholder = $"{appNsPlaceholder}.{queryNode.GetFullPath(".")}"; var queryPlaceholder = $"{queryNode.Name}Query"; var handlerPlaceholder = $"{queryPlaceholder}Handler"; var vmPlaceholder = $"{GetQueryBaseName(queryNode, trimGet: true)}Vm"; template.SetParameter(TemplateParameterType.ApplicationNsPlaceholder, appNsPlaceholder); template.SetParameter(TemplateParameterType.NamespacePlaceholder, namespacePlaceholder); template.SetParameter(TemplateParameterType.HandlerPlaceholder, handlerPlaceholder); template.SetParameter(TemplateParameterType.QueryPlaceholder, queryPlaceholder); template.SetParameter(TemplateParameterType.VmPlaceholder, vmPlaceholder); template.SetParameter(TemplateParameterType.DbContextPlaceholder, _config.DbContext); return(template); }
private ResourceTemplate GetCommandHandlerTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, AppNode cmdNode) { var template = templates[ResourceTemplateType.AppHandler]; template.ResetParameters(); var appNsPlaceholder = $"{_config.Namespace}.{_config.AppSuffix}"; var domainNsPlaceholder = $"{_config.Namespace}.Domain"; var namespacePlaceholder = $"{appNsPlaceholder}.{cmdNode.GetFullPath(".")}"; template.SetParameter(TemplateParameterType.CommandPlaceholder, $"{cmdNode.Name}Command"); template.SetParameter(TemplateParameterType.NamespacePlaceholder, namespacePlaceholder); template.SetParameter(TemplateParameterType.ApplicationNsPlaceholder, appNsPlaceholder); template.SetParameter(TemplateParameterType.DomainNsPlaceholder, domainNsPlaceholder); template.SetParameter(TemplateParameterType.DbContextPlaceholder, _config.DbContext); template.SetParameter(TemplateParameterType.EventPlaceholder, GetEventNameOrUpdated(cmdNode.Name)); template.SetParameter(TemplateParameterType.HandlerPlaceholder, $"{cmdNode.Name}CommandHandler"); return(template); }
private string AddDetailVmTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, Dictionary <string, string> result, AppNode queryNode) { var vm = GetQueryBaseName(queryNode, trimGet: true); var path = $"{queryNode.GetFullPath()}/{vm}Vm.cs"; var template = GetDetailVmTemplate(templates, queryNode); result[path] = template.GetReplacedContent(); return(path); }
private ResourceTemplate GetEventTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, AppNode cmdNode, string eventPlaceholder) { var template = templates[ResourceTemplateType.AppEvent]; template.ResetParameters(); var appNsPlaceholder = $"{_config.Namespace}.{_config.AppSuffix}"; var namespacePlaceholder = $"{appNsPlaceholder}.{cmdNode.GetFullPath(".")}"; var handlerPlaceholder = $"{eventPlaceholder}EventHandler"; template.SetParameter(TemplateParameterType.EventPlaceholder, eventPlaceholder); template.SetParameter(TemplateParameterType.NamespacePlaceholder, namespacePlaceholder); template.SetParameter(TemplateParameterType.ApplicationNsPlaceholder, appNsPlaceholder); template.SetParameter(TemplateParameterType.HandlerPlaceholder, handlerPlaceholder); return(template); }
private ResourceTemplate GetDetailVmTemplate(IDictionary <ResourceTemplateType, ResourceTemplate> templates, AppNode queryNode) { var template = templates[ResourceTemplateType.AppDetailVm]; template.ResetParameters(); var appNsPlaceholder = $"{_config.Namespace}.{_config.AppSuffix}"; var domainNsPlaceholder = $"{_config.Namespace}.Domain"; var namespacePlaceholder = $"{_config.Namespace}.{_config.AppSuffix}.{queryNode.GetFullPath(".")}"; var vmPlaceholder = $"{GetQueryBaseName(queryNode, trimGet: true)}Vm"; template.SetParameter(TemplateParameterType.ApplicationNsPlaceholder, appNsPlaceholder); template.SetParameter(TemplateParameterType.DomainNsPlaceholder, domainNsPlaceholder); template.SetParameter(TemplateParameterType.NamespacePlaceholder, namespacePlaceholder); template.SetParameter(TemplateParameterType.VmPlaceholder, vmPlaceholder); return(template); }