private bool onChildHookMethodIsListProperty(OnChildHookMethod onChildHookMethod, List <ListProperty> domainClassListProperties) { foreach (var listProperty in domainClassListProperties) { if (listProperty.Name == onChildHookMethod.OriginFieldName) { return(true); } } return(false); }
private CodeStatement[] BuildHookExecution(OnChildHookMethod hook) { return(new CodeStatement[] { new CodeExpressionStatement(new CodeSnippetExpression($"var parent = await {hook.ContainingClassName}Repository.Get{hook.OriginFieldName}Parent(parsedEvent.EntityId)")), new CodeExpressionStatement(new CodeSnippetExpression($"var domainResult = parent.{_nameBuilderUtil.OnChildHookMethodName(hook)}(parsedEvent)")), new CodeConditionStatement( new CodeSnippetExpression( $"domainResult.Ok"), new CodeStatement[] { new CodeExpressionStatement(new CodeSnippetExpression($"await {hook.ContainingClassName}Repository.Update{hook.ContainingClassName}(parent)")), new CodeExpressionStatement(new CodeSnippetExpression($"return HookResult.OkResult(domainResult.DomainEvents)")), }) }); }
public string GetClassName(OnChildHookMethod onChildHook, List <Property> classListProperties, List <ListProperty> listProperties) { return(classListProperties.FirstOrDefault(prop => prop.Name == onChildHook.OriginFieldName)?.Type ?? listProperties.FirstOrDefault(prop => prop.Name == onChildHook.OriginFieldName)?.Type); }
public string OnChildHookMethodName(OnChildHookMethod hook) { return($"{hook.Name}_On{hook.OriginFieldName}{hook.MethodName}"); }
public CodeNamespace BuildOnChildHook(OnChildHookMethod onChildHook, List <Property> classProperties, List <ListProperty> classListProperties) { var domainClassName = _nameBuilderUtil.GetClassName(onChildHook, classProperties, classListProperties); var methodName = _nameBuilderUtil.OnChildHookMethodName(onChildHook); var codeNamespace = _nameSpaceBuilderUtil.WithName($"{_applicationNameSpace}.{onChildHook.ContainingClassName}s.Hooks") .WithTask() .WithDomain() .WithApplicationEntityNameSpace(onChildHook.ContainingClassName) .WithDomainEntityNameSpace(domainClassName) .Build(); var codeTypeDeclaration = _classBuilderUtil.BuildPartial($"{methodName}Hook"); codeTypeDeclaration.BaseTypes.Add(new CodeTypeReference(new DomainHookBaseClass().Name)); var codeConstructor = _constructorBuilderUtil.BuildPublic(new List <Property> { new Property { Name = $"{onChildHook.ContainingClassName}Repository", Type = $"I{onChildHook.ContainingClassName}Repository" } }); codeTypeDeclaration.Members.Add(codeConstructor); _propertyBuilderUtil.Build(codeTypeDeclaration, new List <Property> { new Property { Name = $"{onChildHook.ContainingClassName}Repository", Type = $"I{onChildHook.ContainingClassName}Repository" } }); var field = new CodeMemberField { Name = $"EventType {{ get; private set; }} = typeof({domainClassName}{onChildHook.MethodName}Event);NewHackGuid302315ed-3a05-4992-9f76-4cf075cde515", Attributes = MemberAttributes.Public | MemberAttributes.Final, Type = new CodeTypeReference("Type") }; codeTypeDeclaration.Members.Add(field); codeNamespace.Types.Add(codeTypeDeclaration); var codeMemberMethod = new CodeMemberMethod(); codeMemberMethod.Parameters.Add( new CodeParameterDeclarationExpression(new CodeTypeReference(new DomainEventBaseClass().Name), "domainEvent")); codeMemberMethod.ReturnType = new CodeTypeReference($"async {new DomainHookBaseClass().Methods[0].ReturnType}"); codeMemberMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final; codeMemberMethod.Name = new DomainHookBaseClass().Methods[0].Name; codeMemberMethod.Statements.Add(new CodeConditionStatement( new CodeSnippetExpression( $"domainEvent is {domainClassName}{onChildHook.MethodName}Event parsedEvent"), BuildHookExecution(onChildHook) )); codeMemberMethod.Statements.Add( new CodeSnippetExpression("throw new Exception(\"Event is not in the correct list\")")); codeTypeDeclaration.Members.Add(codeMemberMethod); return(codeNamespace); }