<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Vertex Documentation – Vertex Modules</title>
    <link>/docs/modules/</link>
    <description>Recent content in Vertex Modules on Vertex Documentation</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    
	  <atom:link href="/docs/modules/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: CRM module</title>
      <link>/docs/modules/vertex-business-crm/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-business-crm/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the CRM module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Pricing module</title>
      <link>/docs/modules/vertex-business-pricing/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-business-pricing/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the Pricing module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Portfolio Management module</title>
      <link>/docs/modules/vertex-business-portfoliomanagement/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-business-portfoliomanagement/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the Portfolio Management module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Price Forward Curve module</title>
      <link>/docs/modules/vertex-business-priceforwardcurve/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-business-priceforwardcurve/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the Price Forward Curve module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Aggregate module</title>
      <link>/docs/modules/vertex-data-aggregate/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-data-aggregate/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the Aggregate module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Vattenfall module</title>
      <link>/docs/modules/vertex-custom-vattenfall/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-custom-vattenfall/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the Vattenfall module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Documents module</title>
      <link>/docs/modules/vertex-data-documents/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-data-documents/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the document module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: EnergyModel module</title>
      <link>/docs/modules/vertex-data-energymodel/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-data-energymodel/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the EnergyModel module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: TimeSeries module</title>
      <link>/docs/modules/vertex-data-timeseries/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-data-timeseries/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the TimeSeries module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: EDP notifications</title>
      <link>/docs/modules/vertex-dataplatform-notifications/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-dataplatform-notifications/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the EDP Notifications module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Core module</title>
      <link>/docs/modules/vertex-infra-core/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-infra-core/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the Core module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: CQRS Coordinator module</title>
      <link>/docs/modules/vertex-infra-cqrscoordinator/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-infra-cqrscoordinator/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the CQRS Coordinator module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Gateway module</title>
      <link>/docs/modules/vertex-infra-gateway/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-infra-gateway/</guid>
      <description>
        
        
        &lt;p&gt;The gateway is the entry point for all external REST requests to Vertex.&lt;/p&gt;
&lt;h2 id=&#34;partner-transport-tls&#34;&gt;Partner transport TLS&lt;/h2&gt;
&lt;p&gt;A dedicated partner Gateway can terminate TLS before applying its HTTP routing and rate limits.
Configure one optional &lt;code&gt;GatewayModuleConfig.TransportEndpoint&lt;/code&gt; per instance. Route the partner&amp;rsquo;s
hostname through cluster ingress with &lt;strong&gt;TLS passthrough&lt;/strong&gt;, not HTTPS termination or re-encryption.
The downstream module continues to receive HTTP on its interconnect port.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;GatewayModuleConfig&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;Url&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;EnableModuleDiscovery&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;EnableSwagger&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;EnableGraphQL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;EnableUserSessions&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;TransportEndpoint&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;Port&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;8443&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;CertificateBase64&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;${TennetMessageClientCertificateBase64}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;CertificatePassword&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;${TennetMessageClientCertificatePassword}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;An empty &lt;code&gt;Url&lt;/code&gt; leaves the dedicated Gateway without a plaintext HTTP listener. The shared
user-facing Gateway can retain its existing &lt;code&gt;Url&lt;/code&gt; and omit &lt;code&gt;TransportEndpoint&lt;/code&gt;.
The PFX must contain a private key, permit server authentication, and cover the public hostname.
Certificates and pins are loaded at startup; restart the Gateway after changing them.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TransportEndpoint.ClientCertificateSha256Pins&lt;/code&gt; is an optional array of SHA-256 fingerprints
of complete client certificates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Omitted or empty: server-only TLS; no client certificate is requested.&lt;/li&gt;
&lt;li&gt;Non-empty: a client certificate is required and must match a pin &lt;strong&gt;and&lt;/strong&gt; pass normal
certificate-chain, validity and revocation checks. Pins do not bypass CA trust.&lt;/li&gt;
&lt;li&gt;Each entry is 64 hexadecimal characters; colon separators and spaces are accepted.
Windows&amp;rsquo; usual SHA-1 thumbprint is not accepted.&lt;/li&gt;
&lt;li&gt;Include both current and next fingerprints during rotation. Full public leaf certificates
are unnecessary for pinning; private issuing CAs must still be trusted by the Gateway pod.&lt;/li&gt;
&lt;li&gt;Malformed pins or an invalid PFX abort startup rather than falling back to unauthenticated TLS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Obtain a fingerprint with &lt;code&gt;openssl x509 -in client.pem -noout -fingerprint -sha256&lt;/code&gt;.
The pod needs access to the certificate issuer&amp;rsquo;s CRL/OCSP endpoints when mTLS is enabled.&lt;/p&gt;
&lt;p&gt;Use one Gateway deployment per partner to enforce backend isolation with Kubernetes NetworkPolicy.
NetworkPolicy identifies pods and destination ports, not HTTP routes or the source listener.&lt;/p&gt;
&lt;h3 id=&#34;optional-gateway-capabilities&#34;&gt;Optional Gateway capabilities&lt;/h3&gt;
&lt;p&gt;Each capability defaults to &lt;code&gt;true&lt;/code&gt; for existing user-facing deployments. Disable them explicitly
on a partner Gateway; TLS configuration is independent of these switches.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Behavior when disabled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EnableModuleDiscovery&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Does not load or periodically refresh module &lt;code&gt;gateway-routes.yaml&lt;/code&gt; files. Configured &lt;code&gt;BackendConfigs&lt;/code&gt; and &lt;code&gt;RedirectConfigs&lt;/code&gt; still apply.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EnableSwagger&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Does not expose Swagger UI or document endpoints.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EnableGraphQL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Does not register or expose the GraphQL gateway.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EnableUserSessions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Does not register cookie/OIDC login, Redis-backed user sessions, token exchange/refresh, or &lt;code&gt;/gateway/action/*&lt;/code&gt; endpoints. Skips startup OIDC discovery and session-based token injection. Stateless JWT bearer authentication remains available.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;selecting-an-instances-configuration-section&#34;&gt;Selecting an instance&amp;rsquo;s configuration section&lt;/h3&gt;
&lt;p&gt;By default, the Gateway binds &lt;code&gt;GatewayModuleConfig&lt;/code&gt;. Set the deployment environment variable
&lt;code&gt;ConfigSections__GatewayModuleConfig=TennetGatewayModuleConfig&lt;/code&gt; to bind another section instead.
Colon-delimited nested paths are also supported. &lt;code&gt;ModuleId&lt;/code&gt; remains the instance identity and
does not determine the selected section.&lt;/p&gt;
&lt;p&gt;The legacy configuration loader binds only the selected section, after normal Config Server,
vault, environment-variable and placeholder processing. It does not overlay that section onto
&lt;code&gt;GatewayModuleConfig&lt;/code&gt;; shared routes, user-session settings and credentials are not inherited.
An explicitly selected missing or blank section fails startup instead of falling back.
Class-level defaults still apply to properties omitted from the selected section.&lt;/p&gt;
&lt;p&gt;Both sections can live beside each other in &lt;code&gt;config.yaml&lt;/code&gt;, with their environment overrides in
&lt;code&gt;config-acc.yaml&lt;/code&gt;. Maintainers can organize files later using the existing Config Server layers.
Disabling module discovery alone does not remove explicitly configured routes.&lt;/p&gt;
&lt;h2 id=&#34;request-tracing-and-caller-attribution&#34;&gt;Request tracing and caller attribution&lt;/h2&gt;
&lt;h3 id=&#34;trace-context&#34;&gt;Trace context&lt;/h3&gt;
&lt;p&gt;Send a W3C &lt;code&gt;traceparent&lt;/code&gt; header to link the handling of a request in Vertex to a trace in
your own tooling. B3 and Jaeger trace headers are also accepted; when several are present,
&lt;code&gt;traceparent&lt;/code&gt; takes precedence. A missing or malformed trace header never causes a request
to be rejected; Vertex then starts a new trace for that request.&lt;/p&gt;
&lt;h3 id=&#34;caller-headers&#34;&gt;Caller headers&lt;/h3&gt;
&lt;p&gt;Identify your application and job with the following optional headers. They allow traffic
and issues to be traced back to a specific caller and run, without requiring any tracing
tooling on your side.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Header&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X-EE-Application&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Name of the calling application&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PyVertexImporter&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X-EE-Job&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Short logical name of the job or script&lt;/td&gt;
&lt;td&gt;&lt;code&gt;daily-import&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X-EE-Run-Id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Identifier shared by all calls made in one run&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8f14e45f-ceea-467f-a8f5-3c3b6c0e5a01&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Use stable application and job names, and generate a new run identifier for every
execution.&lt;/li&gt;
&lt;li&gt;These headers are diagnostic labels only: they do not authenticate the caller, grant
permissions, or change rate limits.&lt;/li&gt;
&lt;li&gt;Never put credentials, tokens, personal data, or request content in these headers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;header-value-rules&#34;&gt;Header value rules&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Allowed characters are ASCII letters, digits, spaces, &lt;code&gt;.&lt;/code&gt;, &lt;code&gt;_&lt;/code&gt;, and &lt;code&gt;-&lt;/code&gt;; other characters
are removed.&lt;/li&gt;
&lt;li&gt;Values are trimmed and truncated to 128 characters.&lt;/li&gt;
&lt;li&gt;Empty values, repeated headers, comma-separated lists, and values longer than 1,024
characters are ignored.&lt;/li&gt;
&lt;li&gt;An invalid caller header never causes the request itself to be rejected.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Identity Access Management module</title>
      <link>/docs/modules/vertex-infra-iam/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-infra-iam/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the Identity Access Management module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Jobs module</title>
      <link>/docs/modules/vertex-infra-jobs/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-infra-jobs/</guid>
      <description>
        
        
        &lt;p&gt;This is a description of the Jobs module&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: JsonBroker module</title>
      <link>/docs/modules/vertex-infra-jsonbroker/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-infra-jsonbroker/</guid>
      <description>
        
        
        &lt;h2 id=&#34;document-uploads&#34;&gt;Document uploads&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/api/document/new&lt;/code&gt; accepts resumable tus uploads from callers with document-create permission. Creating, inspecting, resuming, deleting, and concatenating an upload require the same authenticated user and selected tenant; the upload URL alone does not grant access. Completed uploads are stored as temporary documents for that tenant.&lt;/p&gt;
&lt;p&gt;Uploads created before this ownership isolation cannot be resumed and must be restarted. Incomplete uploads expire after one day of inactivity.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Rule engine module</title>
      <link>/docs/modules/vertex-infra-ruleengine/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-infra-ruleengine/</guid>
      <description>
        
        
        &lt;p&gt;The Vertex Rule Engine is used to run the specific BRE script language. The hosted rule engine has a set of plugins that are provided by other modules that enables calling methods that leverage specific features of those modules to extend the BRE script language with the modules that are deployed on an environment.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Migration Controller module</title>
      <link>/docs/modules/vertex-infra-migrationcontroller/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-infra-migrationcontroller/</guid>
      <description>
        
        
        &lt;p&gt;The Migration Controller runs event store V1 to V2 migration through distributed
background workers. It provides operations to start migration, retry faulty
aggregates, and inspect migration status.&lt;/p&gt;
&lt;p&gt;Migration requires both &lt;code&gt;SystemTextJsonSerializerEnabled&lt;/code&gt; and
&lt;code&gt;WriteToEventStoreV2Enabled&lt;/code&gt; to be enabled. The controller rejects a new migration
request while another migration run holds the migration lock.&lt;/p&gt;
&lt;p&gt;The runtime project is &lt;code&gt;EE.Modules.Infrastructure.MigrationController&lt;/code&gt;. Its
deployment and documentation component name is &lt;code&gt;vertex-infra-migrationcontroller&lt;/code&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Notification Center module</title>
      <link>/docs/modules/vertex-infra-notificationcenter/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/modules/vertex-infra-notificationcenter/</guid>
      <description>
        
        
        &lt;p&gt;The Notification Center keeps the latest errors and warnings of entities that other
modules report, per entity type and tenant, for a rolling retention period
(&lt;code&gt;NotificationCenterModuleConfig.RetentionPeriodInHours&lt;/code&gt;, one week by default).
The front end reads the overview and the tables of statuses through the GraphQL gateway.&lt;/p&gt;
&lt;p&gt;Entity modules publish through providers. A provider derives from
&lt;code&gt;NotificationCenterProviderBase&lt;/code&gt;, names its recurring job with a
&lt;code&gt;DistributedWorkSchedule&lt;/code&gt; attribute, and publishes the statuses that changed in a
recent lookback period on every run. The Notification Center tracks which period it
holds statuses for. When it misses a period, it answers with that period, and the
provider publishes a snapshot of it. A snapshot holds only the warnings and errors of
that period: the provider queries them separately and leaves out successes, so a large
period stays cheap. Snapshots merge by period, so smaller snapshots add up.
A published status older than the stored status of the same entity is ignored, so a
delayed or replayed publish never overwrites a newer status.
&lt;code&gt;NotificationCenterProvidersConfig.Providers&lt;/code&gt; configures individual providers, keyed by
source module and then by entity type. Each entry can set &lt;code&gt;IsEnabled&lt;/code&gt;, &lt;code&gt;Schedule&lt;/code&gt; (a cron
expression), and &lt;code&gt;ChangesLookbackInMinutes&lt;/code&gt;. A setting that is not set follows the
default of the provider. The lookback must be longer than the interval of the schedule,
so consecutive runs overlap:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;NotificationCenterProvidersConfig&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;Providers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;Aggregate&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;IngestionBatch&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;IsEnabled&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;Schedule&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;*/5 * * * *&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;ChangesLookbackInMinutes&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;15&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A module built with &lt;code&gt;VertexModuleBuilder&lt;/code&gt; adds &lt;code&gt;NotificationCenterProvidersComponent&lt;/code&gt;.
A manually composed module (one deriving from &lt;code&gt;BaseModule&lt;/code&gt;) uses
&lt;code&gt;NotificationCenterManuallyComposedModuleExtensions&lt;/code&gt;: it calls
&lt;code&gt;AddNotificationCenterProviders&lt;/code&gt; in &lt;code&gt;ConfigureModuleServices&lt;/code&gt; with its shutdown token and
the assemblies to scan, and &lt;code&gt;ScheduleNotificationCenterProviders&lt;/code&gt; on its module service
provider in &lt;code&gt;StartModule&lt;/code&gt;. &lt;code&gt;AddNotificationCenterProviders&lt;/code&gt; loads the
&lt;code&gt;NotificationCenterProvidersConfig&lt;/code&gt; section itself.&lt;/p&gt;
&lt;p&gt;Providers publish through &lt;code&gt;INotificationCenterServiceClient&lt;/code&gt;, which the module registers
as a remote gRPC client from &lt;code&gt;EE.Modules.Infrastructure.NotificationCenter.GrpcClient&lt;/code&gt;.
A module built with &lt;code&gt;VertexModuleBuilder&lt;/code&gt; adds it to its &lt;code&gt;GrpcServicesComponent&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AddRemoteGrpcClient&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NotificationCenterService&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NotificationCenterServiceClient&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;INotificationCenterServiceClientFactory&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;INotificationCenterServiceClient&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;GrpcServiceAddresses&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NotificationCenter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;stub&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;NotificationCenterServiceClientFactory&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;stub&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;factory&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;factory&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GetClient&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A manually composed module calls &lt;code&gt;services.AddRemoteGrpcClient&lt;/code&gt; with the same arguments in
&lt;code&gt;ConfigureModuleServices&lt;/code&gt;. The Notification Center serves gRPC on port 7103. The Aspire
AppHost and the &lt;code&gt;vertex&lt;/code&gt; Helm chart inject its address as
&lt;code&gt;services__vertex-infra-notificationcenter__grpc__0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The runtime project is &lt;code&gt;EE.Modules.Infrastructure.NotificationCenter&lt;/code&gt;. Its
deployment and documentation component name is &lt;code&gt;vertex-infra-notificationcenter&lt;/code&gt;.&lt;/p&gt;

      </description>
    </item>
    
  </channel>
</rss>
