public IEnumerable <SourceUnit> Generate(ServiceInfo service) { if (service.IsValid) { ControllerSourceUnit unit = new ControllerSourceUnit(); CqrsControllerBuilder builder = new CqrsControllerBuilder() .WithName(service.Name) .InNamespace(ToNamespace(service.Assembly.GetName().Name)) //TODO .AddDefaultUsings() .AddUsing("Microsoft.AspNetCore.Mvc") .AddUsing("AutoMapper"); foreach (HandlerInfo h in service.Handlers) { // we need to construct: // arguments // Automapper configuration // TODO: Refactor and write UT if (h.IsCommandHandler) { GenerateWriteAction(unit, h, builder); } else if (h.IsQueryHandler) { GenerateReadAction(unit, h, builder); } } unit.Controller = new SourceUnit(builder.Namespace, builder.TypeName, builder.GenerateCode()); return(unit.GetAllUnits()); } else { _logger.Warn("Cannot generate controller for service {serviceName}", service.Name); } return(new SourceUnit[0]); }
private static void GenerateWriteAction(ControllerSourceUnit srcUnit, HandlerInfo handler, CqrsControllerBuilder builder) { if (handler.RequestType.GetProperties().Any(x => x.Name == "Id" || x.Name == $"{handler.Service.Name}Id")) { var prop = handler.RequestType.GetProperties() .First(x => x.Name == "Id" || x.Name == $"{handler.Service.Name}Id"); ArgumentCollection arguments = new ArgumentCollection(); var propTypeInfo = (FullTypeNameInfo)prop.PropertyType; var idArg = arguments.Add(propTypeInfo.ToString(), prop.Name.StartLower()); var cmdArg = arguments.Add(handler.RequestType.Name.EndsWithSingleSuffix("Request", "Command"), "request", "FromBody"); // this is update action // lets check if this put or post. // Put assumes that we have command starting with name "Update" or "Modify" if (handler.RequestType.Name.StartsWithPrefixes("Update", "Modify", "Edit")) { // this is pure PUT // Id is taken from command.id // ResultResponse Put(int id, updaterequest request); var responseType = handler.ResponseType.Name.EndsWithSingleSuffix("Response", "Result"); builder.AppendAction(handler, "Put", responseType, HttpVerb.Put, false, $"api/{handler.Service.Name}/{{{idArg.Name}}}", arguments.ToArray()); srcUnit.Responses.Append(GenerateResponseType(responseType, handler.ResponseType)); srcUnit.ResultToResponseMappers.Append(GenerateResultToResponseMapper(responseType, handler.ResponseType)); srcUnit.Requests.Append(GenerateRequestType(cmdArg.Type, handler.RequestType, prop.PropertyType, prop.Name)); srcUnit.RequestToCommandMappers.Append(GenerateRequestToCommandMapper(cmdArg.Type, handler.RequestType, prop.PropertyType, prop.Name)); builder.AddUsing(handler.ResponseType.Namespace + ".WebApi"); builder.AddUsing(handler.RequestType.Namespace + ".WebApi"); builder.AddUsing(handler.ResponseType.Namespace); builder.AddUsing(handler.RequestType.Namespace); } else { // This is custom method var responseType = handler.ResponseType.Name.EndsWithSingleSuffix("Response", "Result"); string name = handler.RequestType.Name.RemoveSuffixWords("Command").RemoveWords(handler.Service.Name); builder.AppendAction(handler, name, responseType, HttpVerb.Post, handler.IsResponseCollection, $"api/{handler.Service.Name}/{{{idArg.Name}}}/{name}", arguments.ToArray()); srcUnit.Responses.Append(GenerateResponseType(responseType, handler.ResponseType)); srcUnit.ResultToResponseMappers.Append(GenerateResultToResponseMapper(responseType, handler.ResponseType)); srcUnit.Requests.Append(GenerateRequestType(cmdArg.Type, handler.RequestType, prop.PropertyType, prop.Name)); srcUnit.RequestToCommandMappers.Append(GenerateRequestToCommandMapper(cmdArg.Type, handler.RequestType, prop.PropertyType, prop.Name)); builder.AddUsing(handler.ResponseType.Namespace + ".WebApi"); builder.AddUsing(handler.RequestType.Namespace + ".WebApi"); builder.AddUsing(handler.ResponseType.Namespace); builder.AddUsing(handler.RequestType.Namespace); } } else { ArgumentCollection arguments = new ArgumentCollection(); var cmdArg = arguments.Add(handler.RequestType.Name.EndsWithSingleSuffix("Request", "Command"), "request", "FromBody"); // this might be create method if (handler.RequestType.Name.StartsWithPrefixes("Create", "Insert", "Add")) { var responseType = handler.ResponseType.Name.EndsWithSingleSuffix("Response", "Result"); builder.AppendAction(handler, "Post", responseType, HttpVerb.Post, handler.IsResponseCollection, $"api/{handler.Service.Name}", arguments.ToArray()); srcUnit.Responses.Append(GenerateResponseType(responseType, handler.ResponseType)); srcUnit.ResultToResponseMappers.Append(GenerateResultToResponseMapper(responseType, handler.ResponseType)); srcUnit.Requests.Append(GenerateRequestType(cmdArg.Type, handler.RequestType)); srcUnit.RequestToCommandMappers.Append(GenerateRequestToCommandMapper(cmdArg.Type, handler.RequestType)); builder.AddUsing(handler.ResponseType.Namespace + ".WebApi"); builder.AddUsing(handler.RequestType.Namespace + ".WebApi"); builder.AddUsing(handler.ResponseType.Namespace); builder.AddUsing(handler.RequestType.Namespace); } else { // This is unkown method. var responseType = handler.ResponseType.Name.EndsWithSingleSuffix("Response", "Result"); string name = handler.RequestType.Name.RemoveSuffixWords("Command").RemoveWords(handler.Service.Name); builder.AppendAction(handler, name, responseType, HttpVerb.Post, handler.IsResponseCollection, $"api/{handler.Service.Name}/{name}", arguments.ToArray()); srcUnit.Responses.Append(GenerateResponseType(responseType, handler.ResponseType)); srcUnit.ResultToResponseMappers.Append(GenerateResultToResponseMapper(responseType, handler.ResponseType)); srcUnit.Requests.Append(GenerateRequestType(cmdArg.Type, handler.RequestType)); srcUnit.RequestToCommandMappers.Append(GenerateRequestToCommandMapper(cmdArg.Type, handler.RequestType)); builder.AddUsing(handler.ResponseType.Namespace + ".WebApi"); builder.AddUsing(handler.RequestType.Namespace + ".WebApi"); builder.AddUsing(handler.ResponseType.Namespace); builder.AddUsing(handler.RequestType.Namespace); } } }
private void GenerateReadAction(ControllerSourceUnit srcUnit, HandlerInfo handler, CqrsControllerBuilder builder) { if (handler.RequestType.GetProperties().Any(x => x.Name == "Id" || x.Name == $"{handler.Service.Name}Id")) { // this seems to be a query for one record if (!handler.IsResponseCollection) { } else { // this is query for many records } } else { // this seems to be a query for many records. if (!handler.IsResponseCollection) { } else { ArgumentCollection arguments = new ArgumentCollection(); var queryArg = arguments.Add(handler.RequestType.Name.EndsWithSingleSuffix("Request", "Query"), "request", "FromQuery"); // this is query for many records var responseType = handler.ResponseType.Name.EndsWithSingleSuffix("Response", "Result"); builder.AppendAction(handler, "Get", responseType, HttpVerb.Get, handler.IsResponseCollection, $"api/{handler.Service.Name}", arguments.ToArray()); srcUnit.Responses.Append(GenerateResponseType(responseType, handler.ResponseType)); srcUnit.ResultToResponseMappers.Append(GenerateResultToResponseMapper(responseType, handler.ResponseType)); srcUnit.Requests.Append(GenerateRequestType(queryArg.Type, handler.RequestType)); srcUnit.RequestToCommandMappers.Append(GenerateRequestToCommandMapper(queryArg.Type, handler.RequestType)); builder.AddUsing(handler.ResponseType.Namespace + ".WebApi"); builder.AddUsing(handler.RequestType.Namespace + ".WebApi"); builder.AddUsing(handler.ResponseType.Namespace); builder.AddUsing(handler.RequestType.Namespace); } } }