diff --git a/docs/reference/extension/commands.md b/docs/reference/extension/commands.md new file mode 100644 index 0000000..33441bd --- /dev/null +++ b/docs/reference/extension/commands.md @@ -0,0 +1,61 @@ + + +# Commands + +| Command ID | Title | Category | Default Keybinding | When Clause | +|---|---|---|---|---| +| `ppds.configureEnvironment` | Configure Environment | PPDS | | | +| `ppds.copyEnvironmentUrl` | Copy URL | | | | +| `ppds.createProfile` | Create Profile | PPDS | | | +| `ppds.dataExplorer` | Open Data Explorer | PPDS | | | +| `ppds.debug.daemonStatus` | Daemon Status | PPDS Debug | | | +| `ppds.debug.extensionState` | Extension State | PPDS Debug | | | +| `ppds.debug.panelState` | Panel State | PPDS Debug | | | +| `ppds.debug.treeViewState` | Tree View State | PPDS Debug | | | +| `ppds.deleteProfile` | Delete Profile | PPDS | | | +| `ppds.environmentDetails` | Environment Details | PPDS | | | +| `ppds.exportCellResultsCsv` | Export Cell Results to CSV | PPDS | | | +| `ppds.exportCellResultsJson` | Export Cell Results to JSON | PPDS | | | +| `ppds.invalidateProfile` | Invalidate Tokens | PPDS | | | +| `ppds.listProfiles` | List Profiles | PPDS | | | +| `ppds.moveProfileDown` | Move Down | | | | +| `ppds.moveProfileUp` | Move Up | | | | +| `ppds.newNotebook` | New Notebook | PPDS | | | +| `ppds.openCellInDataExplorer` | Open in Data Explorer | PPDS | | | +| `ppds.openConnectionReferences` | Open Connection References | PPDS | | | +| `ppds.openConnectionReferencesForEnv` | Open Connection References | | | | +| `ppds.openDataExplorerForEnv` | Open Data Explorer | | | | +| `ppds.openDocumentation` | Open Documentation | PPDS | | | +| `ppds.openEnvironmentVariables` | Open Environment Variables | PPDS | | | +| `ppds.openEnvironmentVariablesForEnv` | Open Environment Variables | | | | +| `ppds.openImportJobs` | Open Import Jobs | PPDS | | | +| `ppds.openImportJobsForEnv` | Open Import Jobs | | | | +| `ppds.openInDynamics` | Open in Dynamics 365 | | | | +| `ppds.openInMaker` | Open in Maker Portal | | | | +| `ppds.openMetadataBrowser` | Open Metadata Browser | PPDS | | | +| `ppds.openMetadataBrowserForEnv` | Open Metadata Browser | PPDS | | | +| `ppds.openNotebooks` | Open Notebooks | PPDS | | | +| `ppds.openPlugins` | Open Plugin Registration | PPDS | | | +| `ppds.openPluginsForEnv` | Open Plugin Registration | | | | +| `ppds.openPluginTraces` | Open Plugin Traces | PPDS | | | +| `ppds.openPluginTracesForEnv` | Open Plugin Traces | | | | +| `ppds.openQueryInNotebook` | Open Query in Notebook | PPDS | | | +| `ppds.openSolutions` | Open Solutions | PPDS | | | +| `ppds.openSolutionsForEnv` | Open Solutions | | | | +| `ppds.openWebResources` | Open Web Resources | PPDS | | | +| `ppds.openWebResourcesForEnv` | Open Web Resources | | | | +| `ppds.pluginTreeDisableStep` | Disable Step | PPDS | | | +| `ppds.pluginTreeDownload` | Download Binary | PPDS | | | +| `ppds.pluginTreeEnableStep` | Enable Step | PPDS | | | +| `ppds.pluginTreeUnregister` | Unregister | PPDS | | | +| `ppds.profileDetails` | Profile Details | PPDS | | | +| `ppds.refreshProfiles` | Refresh | | | | +| `ppds.removeEnvironment` | Remove Environment | | | | +| `ppds.renameProfile` | Rename Profile | PPDS | | | +| `ppds.restartDaemon` | Restart Daemon | PPDS | | | +| `ppds.selectNotebookEnvironment` | Select Notebook Environment | PPDS | | | +| `ppds.selectProfile` | Select Profile | PPDS | | | +| `ppds.setDefaultEnvironment` | Set as Default | | | | +| `ppds.showLogs` | Show Logs | PPDS | | | +| `ppds.testConnection` | Test Connection | | | | +| `ppds.toggleNotebookCellLanguage` | Toggle SQL/FetchXML | PPDS | | | diff --git a/docs/reference/extension/configuration.md b/docs/reference/extension/configuration.md new file mode 100644 index 0000000..4480a3c --- /dev/null +++ b/docs/reference/extension/configuration.md @@ -0,0 +1,8 @@ + + +# Configuration + +| Setting | Type | Default | Description | +|---|---|---|---| +| `ppds.autoStartDaemon` | `boolean` | `true` | Automatically start the ppds serve daemon when the extension activates | +| `ppds.queryDefaultTop` | `number` | `100` | Default TOP value for SQL queries when none specified | diff --git a/docs/reference/extension/views.md b/docs/reference/extension/views.md new file mode 100644 index 0000000..d943ed3 --- /dev/null +++ b/docs/reference/extension/views.md @@ -0,0 +1,10 @@ + + +# Views + +## `ppds` (activitybar) + +Title: Power Platform Developer Suite + +- `ppds.profiles` — Profiles +- `ppds.tools` — Tools diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/AuthDebugLog.md b/docs/reference/libraries/docs/reference/libraries/Auth/AuthDebugLog.md new file mode 100644 index 0000000..e95e58e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/AuthDebugLog.md @@ -0,0 +1,32 @@ + + +# AuthDebugLog + +- Namespace: `PPDS.Auth` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Controls debug logging output for the auth library. + +## Members + +### Methods + +#### Reset + +`void Reset()` + +Resets the writer to null (no output). + + +### Properties + +#### Writer + +`Action Writer { get; set; }` + +Gets or sets the action used to write debug messages. +Set to null to suppress all output (default). + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/AuthenticationOutput.md b/docs/reference/libraries/docs/reference/libraries/Auth/AuthenticationOutput.md new file mode 100644 index 0000000..b987dcf --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/AuthenticationOutput.md @@ -0,0 +1,33 @@ + + +# AuthenticationOutput + +- Namespace: `PPDS.Auth` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Controls authentication status output for the auth library. + +## Members + +### Methods + +#### Reset + +`void Reset()` + +Resets the writer to the default (Console.Error / stderr). + + +### Properties + +#### Writer + +`Action Writer { get; set; }` + +Gets or sets the action used to write authentication status messages. +Set to null to suppress all output, or provide a custom action to redirect. +Default: writes to Console.Error (stderr — stdout is reserved for data per PPDS I1/NEVER rule) + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Cloud/CloudEndpoints.md b/docs/reference/libraries/docs/reference/libraries/Auth/Cloud/CloudEndpoints.md new file mode 100644 index 0000000..d0a4dae --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Cloud/CloudEndpoints.md @@ -0,0 +1,110 @@ + + +# CloudEndpoints + +- Namespace: `PPDS.Auth.Cloud` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Provides endpoint URLs for different Azure cloud environments. + +## Members + +### Methods + +#### GetAuthorityBaseUrl + +`string GetAuthorityBaseUrl(CloudEnvironment cloud)` + +Gets the base authority URL (without tenant) for the specified cloud environment. + +- Param `cloud`: The cloud environment. + +- Returns: The base authority URL. + +#### GetAuthorityHost + +`Uri GetAuthorityHost(CloudEnvironment cloud)` + +Gets the Azure.Identity authority host URI for the specified cloud environment. + +- Param `cloud`: The cloud environment. + +- Returns: The authority host URI. + +#### GetAuthorityUrl + +`string GetAuthorityUrl(CloudEnvironment cloud, string tenantId)` + +Gets the Azure AD authority URL for the specified cloud environment. + +- Param `cloud`: The cloud environment. + +- Param `tenantId`: Optional tenant ID. Defaults to "organizations" for multi-tenant. + +- Returns: The authority URL. + +#### GetAzureCloudInstance + +`AzureCloudInstance GetAzureCloudInstance(CloudEnvironment cloud)` + +Gets the MSAL Azure cloud instance for the specified cloud environment. + +- Param `cloud`: The cloud environment. + +- Returns: The Azure cloud instance. + +#### GetGlobalDiscoveryUrl + +`string GetGlobalDiscoveryUrl(CloudEnvironment cloud)` + +Gets the Global Discovery Service URL for the specified cloud environment. + +- Param `cloud`: The cloud environment. + +- Returns: The Global Discovery Service URL. + +#### GetPowerAppsApiUrl + +`string GetPowerAppsApiUrl(CloudEnvironment cloud)` + +Gets the Power Apps API base URL for the specified cloud environment. +Used for connections, flows, and other Power Platform management APIs. + +- Param `cloud`: The cloud environment. + +- Returns: The Power Apps API base URL. + +#### GetPowerAppsServiceScope + +`string GetPowerAppsServiceScope(CloudEnvironment cloud)` + +Gets the Power Apps Service scope URL for the specified cloud environment. +This is the resource/audience used when acquiring tokens for the Flow API and Connections API. + +- Param `cloud`: The cloud environment. + +- Returns: The Power Apps Service scope URL (without /.default suffix). + +#### GetPowerAutomateApiUrl + +`string GetPowerAutomateApiUrl(CloudEnvironment cloud)` + +Gets the Power Automate (Flow) API base URL for the specified cloud environment. + +- Param `cloud`: The cloud environment. + +- Returns: The Power Automate API base URL. + +#### Parse + +`CloudEnvironment Parse(string value)` + +Parses a cloud environment from a string value. + +- Param `value`: The string value (case-insensitive). + +- Returns: The cloud environment. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Cloud/CloudEnvironment.md b/docs/reference/libraries/docs/reference/libraries/Auth/Cloud/CloudEnvironment.md new file mode 100644 index 0000000..88444ee --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Cloud/CloudEnvironment.md @@ -0,0 +1,52 @@ + + +# CloudEnvironment + +- Namespace: `PPDS.Auth.Cloud` +- Assembly: `PPDS.Auth` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Azure cloud environments for Dataverse authentication. + +## Members + +### Fields + +#### China + +`CloudEnvironment China` + +Azure China Cloud (21Vianet). +Authority: https://login.chinacloudapi.cn + +#### Public + +`CloudEnvironment Public` + +Azure Public Cloud (default). +Authority: https://login.microsoftonline.com + +#### UsGov + +`CloudEnvironment UsGov` + +Azure US Government Cloud. +Authority: https://login.microsoftonline.us + +#### UsGovDod + +`CloudEnvironment UsGovDod` + +Azure US Government DoD Cloud. +Authority: https://login.microsoftonline.us + +#### UsGovHigh + +`CloudEnvironment UsGovHigh` + +Azure US Government High Cloud. +Authority: https://login.microsoftonline.us + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/AuthenticationException.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/AuthenticationException.md new file mode 100644 index 0000000..66c20ae --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/AuthenticationException.md @@ -0,0 +1,57 @@ + + +# AuthenticationException + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class +- Base: `Exception` +- Implements: `ISerializable` + +## Summary + +Exception thrown when authentication fails. + +## Members + +### Constructors + +#### AuthenticationException(string message) + +`AuthenticationException(string message)` + +Creates a new authentication exception. + +- Param `message`: The error message. + +#### AuthenticationException(string message, Exception innerException) + +`AuthenticationException(string message, Exception innerException)` + +Creates a new authentication exception with an inner exception. + +- Param `message`: The error message. + +- Param `innerException`: The inner exception. + +#### AuthenticationException(string message, string errorCode, Exception innerException) + +`AuthenticationException(string message, string errorCode, Exception innerException)` + +Creates a new authentication exception with an error code. + +- Param `message`: The error message. + +- Param `errorCode`: The error code. + +- Param `innerException`: The inner exception. + + +### Properties + +#### ErrorCode + +`string ErrorCode { get; }` + +Gets the error code, if available. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/AzureDevOpsFederatedCredentialProvider.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/AzureDevOpsFederatedCredentialProvider.md new file mode 100644 index 0000000..e9dbec5 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/AzureDevOpsFederatedCredentialProvider.md @@ -0,0 +1,125 @@ + + +# AzureDevOpsFederatedCredentialProvider + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `ICredentialProvider`, `IDisposable` + +## Summary + +Provides authentication using Azure DevOps OIDC (workload identity federation). +For use in Azure DevOps CI/CD pipelines. + +## Members + +### Constructors + +#### AzureDevOpsFederatedCredentialProvider(string applicationId, string tenantId, CloudEnvironment cloud) + +`AzureDevOpsFederatedCredentialProvider(string applicationId, string tenantId, CloudEnvironment cloud)` + +Creates a new Azure DevOps federated credential provider. + +- Param `applicationId`: The application (client) ID. + +- Param `tenantId`: The tenant ID. + +- Param `cloud`: The cloud environment. + + +### Methods + +#### CreateServiceClientAsync + +`Task CreateServiceClientAsync(string environmentUrl, CancellationToken cancellationToken, bool forceInteractive)` + +Creates an authenticated ServiceClient for the specified environment URL. + +- Param `environmentUrl`: The Dataverse environment URL. + +- Param `cancellationToken`: Cancellation token. + +- Param `forceInteractive`: If true, skip silent auth and prompt user directly. Use for profile creation. + +- Returns: An authenticated ServiceClient. + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### GetCachedTokenInfoAsync + +`Task GetCachedTokenInfoAsync(string environmentUrl, CancellationToken cancellationToken)` + +Gets cached token information without triggering interactive authentication. +Queries the MSAL token cache to determine current token state. + +- Param `environmentUrl`: The Dataverse environment URL to check token for. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Token information if a valid cached token exists, null if token is expired or not cached. + + +### Properties + +#### AccessToken + +`string AccessToken { get; }` + +Gets the access token from the last authentication. +Available after successful authentication. Used for extracting JWT claims. + +#### AuthMethod + +`AuthMethod AuthMethod { get; }` + +Gets the authentication method this provider handles. + +#### HomeAccountId + +`string HomeAccountId { get; }` + +Gets the MSAL home account identifier. +Format: {objectId}.{tenantId} - uniquely identifies the account+tenant for token cache lookup. +Available after successful authentication. + +#### IdTokenClaims + +`ClaimsPrincipal IdTokenClaims { get; }` + +Gets the ID token claims from the last authentication (if available). +The ID token typically contains user claims like country that aren't in the access token. + +#### Identity + +`string Identity { get; }` + +Gets the identity string for display (e.g., username or app ID). +Available after successful authentication. + +#### ObjectId + +`string ObjectId { get; }` + +Gets the Entra Object ID (OID) from the authentication result. +Available after successful authentication. + +#### TenantId + +`string TenantId { get; }` + +Gets the tenant ID from the authentication result. +Available after successful authentication. + +#### TokenExpiresAt + +`Nullable TokenExpiresAt { get; }` + +Gets the token expiration time. +Available after successful authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CachedTokenInfo.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CachedTokenInfo.md new file mode 100644 index 0000000..e53512b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CachedTokenInfo.md @@ -0,0 +1,59 @@ + + +# CachedTokenInfo + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Record +- Implements: `IEquatable` + +## Summary + +Information about a cached token, retrieved without triggering authentication. + +## Members + +### Constructors + +#### CachedTokenInfo(DateTimeOffset ExpiresOn, string Username, bool IsExpired) + +`CachedTokenInfo(DateTimeOffset ExpiresOn, string Username, bool IsExpired)` + +Information about a cached token, retrieved without triggering authentication. + +- Param `ExpiresOn`: When the cached token expires. + +- Param `Username`: The username/identity associated with the token. + +- Param `IsExpired`: Whether the token is expired or will expire within 5 minutes. + + +### Methods + +#### Create + +`CachedTokenInfo Create(DateTimeOffset expiresOn, string username)` + +Creates token info, automatically calculating IsExpired based on a 5-minute buffer. + + +### Properties + +#### ExpiresOn + +`DateTimeOffset ExpiresOn { get; set; }` + +When the cached token expires. + +#### IsExpired + +`bool IsExpired { get; set; }` + +Whether the token is expired or will expire within 5 minutes. + +#### Username + +`string Username { get; set; }` + +The username/identity associated with the token. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CertificateFileCredentialProvider.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CertificateFileCredentialProvider.md new file mode 100644 index 0000000..3f2d430 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CertificateFileCredentialProvider.md @@ -0,0 +1,152 @@ + + +# CertificateFileCredentialProvider + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `ICredentialProvider`, `IDisposable` + +## Summary + +Provides authentication using a certificate file (PFX/P12). + +## Members + +### Constructors + +#### CertificateFileCredentialProvider(string applicationId, string certificatePath, string certificatePassword, string tenantId, CloudEnvironment cloud) + +`CertificateFileCredentialProvider(string applicationId, string certificatePath, string certificatePassword, string tenantId, CloudEnvironment cloud)` + +Creates a new certificate file credential provider. + +- Param `applicationId`: The application (client) ID. + +- Param `certificatePath`: Path to the certificate file (PFX/P12). + +- Param `certificatePassword`: Password for the certificate file (optional). + +- Param `tenantId`: The tenant ID. + +- Param `cloud`: The cloud environment. + + +### Methods + +#### CreateServiceClientAsync + +`Task CreateServiceClientAsync(string environmentUrl, CancellationToken cancellationToken, bool forceInteractive)` + +Creates an authenticated ServiceClient for the specified environment URL. + +- Param `environmentUrl`: The Dataverse environment URL. + +- Param `cancellationToken`: Cancellation token. + +- Param `forceInteractive`: If true, skip silent auth and prompt user directly. Use for profile creation. + +- Returns: An authenticated ServiceClient. + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### FromProfile + +`CertificateFileCredentialProvider FromProfile(AuthProfile profile, StoredCredential credential)` + +Creates a provider from an auth profile and credential from secure store. + +- Param `profile`: The auth profile. + +- Param `credential`: The credential containing the certificate password. + +- Returns: A new provider instance. + +#### FromProfileWithPassword + +`CertificateFileCredentialProvider FromProfileWithPassword(AuthProfile profile, string certificatePassword)` + +Creates a provider from an auth profile with explicit certificate password. + +- Param `profile`: The auth profile. + +- Param `certificatePassword`: The certificate password (optional). + +- Returns: A new provider instance. + +#### GetCachedTokenInfoAsync + +`Task GetCachedTokenInfoAsync(string environmentUrl, CancellationToken cancellationToken)` + +Gets cached token information without triggering interactive authentication. +Queries the MSAL token cache to determine current token state. + +- Param `environmentUrl`: The Dataverse environment URL to check token for. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Token information if a valid cached token exists, null if token is expired or not cached. + + +### Properties + +#### AccessToken + +`string AccessToken { get; }` + +Gets the access token from the last authentication. +Available after successful authentication. Used for extracting JWT claims. + +#### AuthMethod + +`AuthMethod AuthMethod { get; }` + +Gets the authentication method this provider handles. + +#### HomeAccountId + +`string HomeAccountId { get; }` + +Gets the MSAL home account identifier. +Format: {objectId}.{tenantId} - uniquely identifies the account+tenant for token cache lookup. +Available after successful authentication. + +#### IdTokenClaims + +`ClaimsPrincipal IdTokenClaims { get; }` + +Gets the ID token claims from the last authentication (if available). +The ID token typically contains user claims like country that aren't in the access token. + +#### Identity + +`string Identity { get; }` + +Gets the identity string for display (e.g., username or app ID). +Available after successful authentication. + +#### ObjectId + +`string ObjectId { get; }` + +Gets the Entra Object ID (OID) from the authentication result. +Available after successful authentication. + +#### TenantId + +`string TenantId { get; }` + +Gets the tenant ID from the authentication result. +Available after successful authentication. + +#### TokenExpiresAt + +`Nullable TokenExpiresAt { get; }` + +Gets the token expiration time. +Available after successful authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CertificateStoreCredentialProvider.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CertificateStoreCredentialProvider.md new file mode 100644 index 0000000..6d3489b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CertificateStoreCredentialProvider.md @@ -0,0 +1,140 @@ + + +# CertificateStoreCredentialProvider + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `ICredentialProvider`, `IDisposable` + +## Summary + +Provides authentication using a certificate from the Windows certificate store. + +## Members + +### Constructors + +#### CertificateStoreCredentialProvider(string applicationId, string thumbprint, string tenantId, StoreName storeName, StoreLocation storeLocation, CloudEnvironment cloud) + +`CertificateStoreCredentialProvider(string applicationId, string thumbprint, string tenantId, StoreName storeName, StoreLocation storeLocation, CloudEnvironment cloud)` + +Creates a new certificate store credential provider. + +- Param `applicationId`: The application (client) ID. + +- Param `thumbprint`: The certificate thumbprint. + +- Param `tenantId`: The tenant ID. + +- Param `storeName`: The certificate store name (default: My). + +- Param `storeLocation`: The certificate store location (default: CurrentUser). + +- Param `cloud`: The cloud environment. + + +### Methods + +#### CreateServiceClientAsync + +`Task CreateServiceClientAsync(string environmentUrl, CancellationToken cancellationToken, bool forceInteractive)` + +Creates an authenticated ServiceClient for the specified environment URL. + +- Param `environmentUrl`: The Dataverse environment URL. + +- Param `cancellationToken`: Cancellation token. + +- Param `forceInteractive`: If true, skip silent auth and prompt user directly. Use for profile creation. + +- Returns: An authenticated ServiceClient. + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### FromProfile + +`CertificateStoreCredentialProvider FromProfile(AuthProfile profile)` + +Creates a provider from an auth profile. + +- Param `profile`: The auth profile. + +- Returns: A new provider instance. + +#### GetCachedTokenInfoAsync + +`Task GetCachedTokenInfoAsync(string environmentUrl, CancellationToken cancellationToken)` + +Gets cached token information without triggering interactive authentication. +Queries the MSAL token cache to determine current token state. + +- Param `environmentUrl`: The Dataverse environment URL to check token for. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Token information if a valid cached token exists, null if token is expired or not cached. + + +### Properties + +#### AccessToken + +`string AccessToken { get; }` + +Gets the access token from the last authentication. +Available after successful authentication. Used for extracting JWT claims. + +#### AuthMethod + +`AuthMethod AuthMethod { get; }` + +Gets the authentication method this provider handles. + +#### HomeAccountId + +`string HomeAccountId { get; }` + +Gets the MSAL home account identifier. +Format: {objectId}.{tenantId} - uniquely identifies the account+tenant for token cache lookup. +Available after successful authentication. + +#### IdTokenClaims + +`ClaimsPrincipal IdTokenClaims { get; }` + +Gets the ID token claims from the last authentication (if available). +The ID token typically contains user claims like country that aren't in the access token. + +#### Identity + +`string Identity { get; }` + +Gets the identity string for display (e.g., username or app ID). +Available after successful authentication. + +#### ObjectId + +`string ObjectId { get; }` + +Gets the Entra Object ID (OID) from the authentication result. +Available after successful authentication. + +#### TenantId + +`string TenantId { get; }` + +Gets the tenant ID from the authentication result. +Available after successful authentication. + +#### TokenExpiresAt + +`Nullable TokenExpiresAt { get; }` + +Gets the token expiration time. +Available after successful authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/ClientSecretCredentialProvider.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/ClientSecretCredentialProvider.md new file mode 100644 index 0000000..4d6a65b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/ClientSecretCredentialProvider.md @@ -0,0 +1,150 @@ + + +# ClientSecretCredentialProvider + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `ICredentialProvider`, `IDisposable` + +## Summary + +Provides authentication using client ID and client secret (Service Principal). + +## Members + +### Constructors + +#### ClientSecretCredentialProvider(string applicationId, string clientSecret, string tenantId, CloudEnvironment cloud) + +`ClientSecretCredentialProvider(string applicationId, string clientSecret, string tenantId, CloudEnvironment cloud)` + +Creates a new client secret credential provider. + +- Param `applicationId`: The application (client) ID. + +- Param `clientSecret`: The client secret. + +- Param `tenantId`: The tenant ID. + +- Param `cloud`: The cloud environment. + + +### Methods + +#### CreateServiceClientAsync + +`Task CreateServiceClientAsync(string environmentUrl, CancellationToken cancellationToken, bool forceInteractive)` + +Creates an authenticated ServiceClient for the specified environment URL. + +- Param `environmentUrl`: The Dataverse environment URL. + +- Param `cancellationToken`: Cancellation token. + +- Param `forceInteractive`: If true, skip silent auth and prompt user directly. Use for profile creation. + +- Returns: An authenticated ServiceClient. + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### FromProfile + +`ClientSecretCredentialProvider FromProfile(AuthProfile profile, StoredCredential credential)` + +Creates a provider from an auth profile and credential from secure store. + +- Param `profile`: The auth profile. + +- Param `credential`: The credential containing the client secret. + +- Returns: A new provider instance. + +#### FromProfileWithSecret + +`ClientSecretCredentialProvider FromProfileWithSecret(AuthProfile profile, string clientSecret)` + +Creates a provider from an auth profile using an environment variable secret. + +- Param `profile`: The auth profile. + +- Param `clientSecret`: The client secret (e.g., from PPDS_SPN_SECRET env var). + +- Returns: A new provider instance. + +#### GetCachedTokenInfoAsync + +`Task GetCachedTokenInfoAsync(string environmentUrl, CancellationToken cancellationToken)` + +Gets cached token information without triggering interactive authentication. +Queries the MSAL token cache to determine current token state. + +- Param `environmentUrl`: The Dataverse environment URL to check token for. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Token information if a valid cached token exists, null if token is expired or not cached. + + +### Properties + +#### AccessToken + +`string AccessToken { get; }` + +Gets the access token from the last authentication. +Available after successful authentication. Used for extracting JWT claims. + +#### AuthMethod + +`AuthMethod AuthMethod { get; }` + +Gets the authentication method this provider handles. + +#### HomeAccountId + +`string HomeAccountId { get; }` + +Gets the MSAL home account identifier. +Format: {objectId}.{tenantId} - uniquely identifies the account+tenant for token cache lookup. +Available after successful authentication. + +#### IdTokenClaims + +`ClaimsPrincipal IdTokenClaims { get; }` + +Gets the ID token claims from the last authentication (if available). +The ID token typically contains user claims like country that aren't in the access token. + +#### Identity + +`string Identity { get; }` + +Gets the identity string for display (e.g., username or app ID). +Available after successful authentication. + +#### ObjectId + +`string ObjectId { get; }` + +Gets the Entra Object ID (OID) from the authentication result. +Available after successful authentication. + +#### TenantId + +`string TenantId { get; }` + +Gets the tenant ID from the authentication result. +Available after successful authentication. + +#### TokenExpiresAt + +`Nullable TokenExpiresAt { get; }` + +Gets the token expiration time. +Available after successful authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CredentialProviderFactory.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CredentialProviderFactory.md new file mode 100644 index 0000000..f035552 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CredentialProviderFactory.md @@ -0,0 +1,95 @@ + + +# CredentialProviderFactory + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Factory for creating credential providers from auth profiles. + +## Members + +### Methods + +#### Create + +`ICredentialProvider Create(AuthProfile profile, Action deviceCodeCallback, Func, PreAuthDialogResult> beforeInteractiveAuth)` + +Creates a credential provider synchronously. +Prefer CreateAsync when possible for better performance with secure store lookups. + +- Param `profile`: The auth profile. + +- Param `deviceCodeCallback`: Optional callback for device code display. + +- Param `beforeInteractiveAuth`: Optional callback invoked before browser opens for interactive auth. + Returns the user's choice (OpenBrowser, UseDeviceCode, or Cancel). + +- Returns: A credential provider for the profile's auth method. + +#### CreateAsync + +`Task CreateAsync(AuthProfile profile, ISecureCredentialStore credentialStore, Action deviceCodeCallback, Func, PreAuthDialogResult> beforeInteractiveAuth, string clientSecretOverride, CancellationToken cancellationToken)` + +Creates a credential provider for the specified auth profile. + +- Param `profile`: The auth profile. + +- Param `credentialStore`: Optional secure credential store for looking up secrets. + +- Param `deviceCodeCallback`: Optional callback for device code display. + +- Param `beforeInteractiveAuth`: Optional callback invoked before browser opens for interactive auth. + Returns the user's choice (OpenBrowser, UseDeviceCode, or Cancel). + +- Param `clientSecretOverride`: Optional client secret that takes priority over env var and credential store lookups. + +- Param `cancellationToken`: Cancellation token. + +- Returns: A credential provider for the profile's auth method. + +#### GetSpnSecretFromEnvironment + +`string GetSpnSecretFromEnvironment()` + +Gets the SPN secret from environment variables, checking both production and test variables. +Returns null if neither is set. + +#### IsSupported + +`bool IsSupported(AuthMethod authMethod)` + +Checks if the specified auth method is supported. + +#### RequiresCredentialStore + +`bool RequiresCredentialStore(AuthMethod authMethod)` + +Checks if the specified auth method requires a secure credential store. + +#### ShouldBypassCredentialStore + +`bool ShouldBypassCredentialStore()` + +Returns true if credential store should be bypassed (SPN secret is available via environment). + + +### Fields + +#### SpnSecretEnvVar + +`string SpnSecretEnvVar` + +Environment variable name for service principal secret bypass. +When set, this value is used instead of looking up from secure store. + +#### TestClientSecretEnvVar + +`string TestClientSecretEnvVar` + +Fallback environment variable for test scenarios. +Checked when `PPDS.Auth.Credentials.CredentialProviderFactory.SpnSecretEnvVar` is not set. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CredentialResult.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CredentialResult.md new file mode 100644 index 0000000..2aa4874 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/CredentialResult.md @@ -0,0 +1,67 @@ + + +# CredentialResult + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Result of creating a credential provider. + +## Members + +### Methods + +#### Failed + +`CredentialResult Failed(string message, Exception exception)` + +Creates a failed result. + +#### Succeeded + +`CredentialResult Succeeded(ServiceClient client, string identity, Nullable expiresAt)` + +Creates a successful result. + + +### Properties + +#### Client + +`ServiceClient Client { get; set; }` + +Gets the authenticated ServiceClient, if successful. + +#### ErrorMessage + +`string ErrorMessage { get; set; }` + +Gets the error message, if authentication failed. + +#### Exception + +`Exception Exception { get; set; }` + +Gets the exception, if authentication failed. + +#### Identity + +`string Identity { get; set; }` + +Gets the identity string (username or app ID). + +#### Success + +`bool Success { get; set; }` + +Gets whether the authentication was successful. + +#### TokenExpiresAt + +`Nullable TokenExpiresAt { get; set; }` + +Gets the token expiration time. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/DeviceCodeCredentialProvider.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/DeviceCodeCredentialProvider.md new file mode 100644 index 0000000..b18124d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/DeviceCodeCredentialProvider.md @@ -0,0 +1,141 @@ + + +# DeviceCodeCredentialProvider + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `ICredentialProvider`, `IDisposable` + +## Summary + +Provides authentication using device code flow. +User visits a URL and enters a code to authenticate. + +## Members + +### Constructors + +#### DeviceCodeCredentialProvider(CloudEnvironment cloud, string tenantId, string username, string homeAccountId, Action deviceCodeCallback) + +`DeviceCodeCredentialProvider(CloudEnvironment cloud, string tenantId, string username, string homeAccountId, Action deviceCodeCallback)` + +Creates a new device code credential provider. + +- Param `cloud`: The cloud environment. + +- Param `tenantId`: Optional tenant ID (defaults to "organizations" for multi-tenant). + +- Param `username`: Optional username for silent auth lookup. + +- Param `homeAccountId`: Optional MSAL home account identifier for precise account lookup. + +- Param `deviceCodeCallback`: Optional callback for displaying device code (defaults to console output). + + +### Methods + +#### CreateServiceClientAsync + +`Task CreateServiceClientAsync(string environmentUrl, CancellationToken cancellationToken, bool forceInteractive)` + +Creates an authenticated ServiceClient for the specified environment URL. + +- Param `environmentUrl`: The Dataverse environment URL. + +- Param `cancellationToken`: Cancellation token. + +- Param `forceInteractive`: If true, skip silent auth and prompt user directly. Use for profile creation. + +- Returns: An authenticated ServiceClient. + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### FromProfile + +`DeviceCodeCredentialProvider FromProfile(AuthProfile profile, Action deviceCodeCallback)` + +Creates a provider from an auth profile. + +- Param `profile`: The auth profile. + +- Param `deviceCodeCallback`: Optional callback for displaying device code. + +- Returns: A new provider instance. + +#### GetCachedTokenInfoAsync + +`Task GetCachedTokenInfoAsync(string environmentUrl, CancellationToken cancellationToken)` + +Gets cached token information without triggering interactive authentication. +Queries the MSAL token cache to determine current token state. + +- Param `environmentUrl`: The Dataverse environment URL to check token for. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Token information if a valid cached token exists, null if token is expired or not cached. + + +### Properties + +#### AccessToken + +`string AccessToken { get; }` + +Gets the access token from the last authentication. +Available after successful authentication. Used for extracting JWT claims. + +#### AuthMethod + +`AuthMethod AuthMethod { get; }` + +Gets the authentication method this provider handles. + +#### HomeAccountId + +`string HomeAccountId { get; }` + +Gets the MSAL home account identifier. +Format: {objectId}.{tenantId} - uniquely identifies the account+tenant for token cache lookup. +Available after successful authentication. + +#### IdTokenClaims + +`ClaimsPrincipal IdTokenClaims { get; }` + +Gets the ID token claims from the last authentication (if available). +The ID token typically contains user claims like country that aren't in the access token. + +#### Identity + +`string Identity { get; }` + +Gets the identity string for display (e.g., username or app ID). +Available after successful authentication. + +#### ObjectId + +`string ObjectId { get; }` + +Gets the Entra Object ID (OID) from the authentication result. +Available after successful authentication. + +#### TenantId + +`string TenantId { get; }` + +Gets the tenant ID from the authentication result. +Available after successful authentication. + +#### TokenExpiresAt + +`Nullable TokenExpiresAt { get; }` + +Gets the token expiration time. +Available after successful authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/DeviceCodeInfo.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/DeviceCodeInfo.md new file mode 100644 index 0000000..e92ee3e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/DeviceCodeInfo.md @@ -0,0 +1,43 @@ + + +# DeviceCodeInfo + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Information about a device code for authentication. + +## Members + +### Constructors + +#### DeviceCodeInfo(string userCode, string verificationUrl, string message) + +`DeviceCodeInfo(string userCode, string verificationUrl, string message)` + +Creates a new DeviceCodeInfo. + + +### Properties + +#### Message + +`string Message { get; }` + +Gets the full message to display to the user. + +#### UserCode + +`string UserCode { get; }` + +Gets the user code to enter at the verification URL. + +#### VerificationUrl + +`string VerificationUrl { get; }` + +Gets the verification URL to open in a browser. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/GitHubFederatedCredentialProvider.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/GitHubFederatedCredentialProvider.md new file mode 100644 index 0000000..a77c9d8 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/GitHubFederatedCredentialProvider.md @@ -0,0 +1,125 @@ + + +# GitHubFederatedCredentialProvider + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `ICredentialProvider`, `IDisposable` + +## Summary + +Provides authentication using GitHub Actions OIDC (workload identity federation). +For use in GitHub Actions CI/CD pipelines. + +## Members + +### Constructors + +#### GitHubFederatedCredentialProvider(string applicationId, string tenantId, CloudEnvironment cloud) + +`GitHubFederatedCredentialProvider(string applicationId, string tenantId, CloudEnvironment cloud)` + +Creates a new GitHub federated credential provider. + +- Param `applicationId`: The application (client) ID. + +- Param `tenantId`: The tenant ID. + +- Param `cloud`: The cloud environment. + + +### Methods + +#### CreateServiceClientAsync + +`Task CreateServiceClientAsync(string environmentUrl, CancellationToken cancellationToken, bool forceInteractive)` + +Creates an authenticated ServiceClient for the specified environment URL. + +- Param `environmentUrl`: The Dataverse environment URL. + +- Param `cancellationToken`: Cancellation token. + +- Param `forceInteractive`: If true, skip silent auth and prompt user directly. Use for profile creation. + +- Returns: An authenticated ServiceClient. + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### GetCachedTokenInfoAsync + +`Task GetCachedTokenInfoAsync(string environmentUrl, CancellationToken cancellationToken)` + +Gets cached token information without triggering interactive authentication. +Queries the MSAL token cache to determine current token state. + +- Param `environmentUrl`: The Dataverse environment URL to check token for. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Token information if a valid cached token exists, null if token is expired or not cached. + + +### Properties + +#### AccessToken + +`string AccessToken { get; }` + +Gets the access token from the last authentication. +Available after successful authentication. Used for extracting JWT claims. + +#### AuthMethod + +`AuthMethod AuthMethod { get; }` + +Gets the authentication method this provider handles. + +#### HomeAccountId + +`string HomeAccountId { get; }` + +Gets the MSAL home account identifier. +Format: {objectId}.{tenantId} - uniquely identifies the account+tenant for token cache lookup. +Available after successful authentication. + +#### IdTokenClaims + +`ClaimsPrincipal IdTokenClaims { get; }` + +Gets the ID token claims from the last authentication (if available). +The ID token typically contains user claims like country that aren't in the access token. + +#### Identity + +`string Identity { get; }` + +Gets the identity string for display (e.g., username or app ID). +Available after successful authentication. + +#### ObjectId + +`string ObjectId { get; }` + +Gets the Entra Object ID (OID) from the authentication result. +Available after successful authentication. + +#### TenantId + +`string TenantId { get; }` + +Gets the tenant ID from the authentication result. +Available after successful authentication. + +#### TokenExpiresAt + +`Nullable TokenExpiresAt { get; }` + +Gets the token expiration time. +Available after successful authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/ICredentialProvider.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/ICredentialProvider.md new file mode 100644 index 0000000..04de41c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/ICredentialProvider.md @@ -0,0 +1,103 @@ + + +# ICredentialProvider + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Interface +- Implements: `IDisposable` + +## Summary + +Provides authenticated ServiceClient instances for a specific auth method. + +## Members + +### Methods + +#### CreateServiceClientAsync + +`Task CreateServiceClientAsync(string environmentUrl, CancellationToken cancellationToken, bool forceInteractive)` + +Creates an authenticated ServiceClient for the specified environment URL. + +- Param `environmentUrl`: The Dataverse environment URL. + +- Param `cancellationToken`: Cancellation token. + +- Param `forceInteractive`: If true, skip silent auth and prompt user directly. Use for profile creation. + +- Returns: An authenticated ServiceClient. + +#### GetCachedTokenInfoAsync + +`Task GetCachedTokenInfoAsync(string environmentUrl, CancellationToken cancellationToken)` + +Gets cached token information without triggering interactive authentication. +Queries the MSAL token cache to determine current token state. + +- Param `environmentUrl`: The Dataverse environment URL to check token for. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Token information if a valid cached token exists, null if token is expired or not cached. + + +### Properties + +#### AccessToken + +`string AccessToken { get; }` + +Gets the access token from the last authentication. +Available after successful authentication. Used for extracting JWT claims. + +#### AuthMethod + +`AuthMethod AuthMethod { get; }` + +Gets the authentication method this provider handles. + +#### HomeAccountId + +`string HomeAccountId { get; }` + +Gets the MSAL home account identifier. +Format: {objectId}.{tenantId} - uniquely identifies the account+tenant for token cache lookup. +Available after successful authentication. + +#### IdTokenClaims + +`ClaimsPrincipal IdTokenClaims { get; }` + +Gets the ID token claims from the last authentication (if available). +The ID token typically contains user claims like country that aren't in the access token. + +#### Identity + +`string Identity { get; }` + +Gets the identity string for display (e.g., username or app ID). +Available after successful authentication. + +#### ObjectId + +`string ObjectId { get; }` + +Gets the Entra Object ID (OID) from the authentication result. +Available after successful authentication. + +#### TenantId + +`string TenantId { get; }` + +Gets the tenant ID from the authentication result. +Available after successful authentication. + +#### TokenExpiresAt + +`Nullable TokenExpiresAt { get; }` + +Gets the token expiration time. +Available after successful authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/IPowerPlatformTokenProvider.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/IPowerPlatformTokenProvider.md new file mode 100644 index 0000000..da3c08f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/IPowerPlatformTokenProvider.md @@ -0,0 +1,65 @@ + + +# IPowerPlatformTokenProvider + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Interface +- Implements: `IDisposable` + +## Summary + +Provides access tokens for Power Platform REST APIs (Power Apps, Power Automate, etc.). +Unlike `PPDS.Auth.Credentials.ICredentialProvider` which creates ServiceClient for Dataverse, +this interface acquires tokens for the Power Platform management APIs. + +## Members + +### Methods + +#### GetFlowApiTokenAsync + +`Task GetFlowApiTokenAsync(CancellationToken cancellationToken)` + +Acquires an access token for the Flow API using the correct service.powerapps.com scope. +Use this method for Flow API and Connections API operations, which require the +service.powerapps.com audience rather than api.flow.microsoft.com. + +- Param `cancellationToken`: Cancellation token. + +- Returns: A valid access token with service.powerapps.com audience. + +#### GetPowerAppsTokenAsync + +`Task GetPowerAppsTokenAsync(CancellationToken cancellationToken)` + +Acquires an access token for the Power Apps API. +Resource: https://api.powerapps.com (varies by cloud). + +- Param `cancellationToken`: Cancellation token. + +- Returns: A valid access token. + +#### GetPowerAutomateTokenAsync + +`Task GetPowerAutomateTokenAsync(CancellationToken cancellationToken)` + +Acquires an access token for the Power Automate (Flow) API. +Resource: https://api.flow.microsoft.com (varies by cloud). + +- Param `cancellationToken`: Cancellation token. + +- Returns: A valid access token. + +#### GetTokenForResourceAsync + +`Task GetTokenForResourceAsync(string resource, CancellationToken cancellationToken)` + +Acquires an access token for the specified Power Platform resource. + +- Param `resource`: The resource URL (e.g., https://api.powerapps.com). + +- Param `cancellationToken`: Cancellation token. + +- Returns: A valid access token. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/ISecureCredentialStore.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/ISecureCredentialStore.md new file mode 100644 index 0000000..db8e018 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/ISecureCredentialStore.md @@ -0,0 +1,79 @@ + + +# ISecureCredentialStore + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Interface + +## Summary + +Provides secure, platform-native credential storage for service principal secrets. + +## Members + +### Methods + +#### ClearAsync + +`Task ClearAsync(CancellationToken cancellationToken)` + +Clears all stored credentials. + +- Param `cancellationToken`: Cancellation token. + +#### ExistsAsync + +`Task ExistsAsync(string applicationId, CancellationToken cancellationToken)` + +Checks if credentials exist for a service principal. + +- Param `applicationId`: The application (client) ID. + +- Param `cancellationToken`: Cancellation token. + +- Returns: True if credentials exist. + +#### GetAsync + +`Task GetAsync(string applicationId, CancellationToken cancellationToken)` + +Retrieves credentials for a service principal by application ID. + +- Param `applicationId`: The application (client) ID. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The stored credential, or null if not found. + +#### RemoveAsync + +`Task RemoveAsync(string applicationId, CancellationToken cancellationToken)` + +Removes credentials for a service principal. + +- Param `applicationId`: The application (client) ID. + +- Param `cancellationToken`: Cancellation token. + +- Returns: True if removed, false if not found. + +#### StoreAsync + +`Task StoreAsync(StoredCredential credential, CancellationToken cancellationToken)` + +Stores credentials for a service principal. + +- Param `credential`: The credential to store. + +- Param `cancellationToken`: Cancellation token. + + +### Properties + +#### IsCleartextCachingEnabled + +`bool IsCleartextCachingEnabled { get; }` + +Gets whether cleartext caching is enabled (Linux fallback). + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/InteractiveBrowserCredentialProvider.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/InteractiveBrowserCredentialProvider.md new file mode 100644 index 0000000..0b9da96 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/InteractiveBrowserCredentialProvider.md @@ -0,0 +1,155 @@ + + +# InteractiveBrowserCredentialProvider + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `ICredentialProvider`, `IDisposable` + +## Summary + +Provides authentication using interactive browser flow. +Automatically opens the system browser for user sign-in. + +## Members + +### Constructors + +#### InteractiveBrowserCredentialProvider(CloudEnvironment cloud, string tenantId, string username, string homeAccountId, Action deviceCodeCallback, Func, PreAuthDialogResult> beforeInteractiveAuth) + +`InteractiveBrowserCredentialProvider(CloudEnvironment cloud, string tenantId, string username, string homeAccountId, Action deviceCodeCallback, Func, PreAuthDialogResult> beforeInteractiveAuth)` + +Creates a new interactive browser credential provider. + +- Param `cloud`: The cloud environment. + +- Param `tenantId`: Optional tenant ID (defaults to "organizations" for multi-tenant). + +- Param `username`: Optional username for silent auth lookup. + +- Param `homeAccountId`: Optional MSAL home account identifier for precise account lookup. + +- Param `deviceCodeCallback`: Optional callback for device code display (used for device code fallback). + +- Param `beforeInteractiveAuth`: Optional callback invoked before opening browser for auth. + Returns the user's choice (OpenBrowser, UseDeviceCode, or Cancel). + The callback receives a device code callback to use if device code is selected. + + +### Methods + +#### CreateServiceClientAsync + +`Task CreateServiceClientAsync(string environmentUrl, CancellationToken cancellationToken, bool forceInteractive)` + +Creates an authenticated ServiceClient for the specified environment URL. + +- Param `environmentUrl`: The Dataverse environment URL. + +- Param `cancellationToken`: Cancellation token. + +- Param `forceInteractive`: If true, skip silent auth and prompt user directly. Use for profile creation. + +- Returns: An authenticated ServiceClient. + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### FromProfile + +`InteractiveBrowserCredentialProvider FromProfile(AuthProfile profile, Action deviceCodeCallback, Func, PreAuthDialogResult> beforeInteractiveAuth)` + +Creates a provider from an auth profile. + +- Param `profile`: The auth profile. + +- Param `deviceCodeCallback`: Optional callback for device code display (used for device code fallback). + +- Param `beforeInteractiveAuth`: Optional callback invoked before opening browser for auth. + Returns the user's choice (OpenBrowser, UseDeviceCode, or Cancel). + +- Returns: A new provider instance. + +#### GetCachedTokenInfoAsync + +`Task GetCachedTokenInfoAsync(string environmentUrl, CancellationToken cancellationToken)` + +Gets cached token information without triggering interactive authentication. +Queries the MSAL token cache to determine current token state. + +- Param `environmentUrl`: The Dataverse environment URL to check token for. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Token information if a valid cached token exists, null if token is expired or not cached. + +#### IsAvailable + +`bool IsAvailable()` + +Checks if interactive browser authentication is available. +Returns false for headless environments (SSH, containers, no display). + + +### Properties + +#### AccessToken + +`string AccessToken { get; }` + +Gets the access token from the last authentication. +Available after successful authentication. Used for extracting JWT claims. + +#### AuthMethod + +`AuthMethod AuthMethod { get; }` + +Gets the authentication method this provider handles. + +#### HomeAccountId + +`string HomeAccountId { get; }` + +Gets the MSAL home account identifier. +Format: {objectId}.{tenantId} - uniquely identifies the account+tenant for token cache lookup. +Available after successful authentication. + +#### IdTokenClaims + +`ClaimsPrincipal IdTokenClaims { get; }` + +Gets the ID token claims from the last authentication (if available). +The ID token typically contains user claims like country that aren't in the access token. + +#### Identity + +`string Identity { get; }` + +Gets the identity string for display (e.g., username or app ID). +Available after successful authentication. + +#### ObjectId + +`string ObjectId { get; }` + +Gets the Entra Object ID (OID) from the authentication result. +Available after successful authentication. + +#### TenantId + +`string TenantId { get; }` + +Gets the tenant ID from the authentication result. +Available after successful authentication. + +#### TokenExpiresAt + +`Nullable TokenExpiresAt { get; }` + +Gets the token expiration time. +Available after successful authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/ManagedIdentityCredentialProvider.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/ManagedIdentityCredentialProvider.md new file mode 100644 index 0000000..992152f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/ManagedIdentityCredentialProvider.md @@ -0,0 +1,131 @@ + + +# ManagedIdentityCredentialProvider + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `ICredentialProvider`, `IDisposable` + +## Summary + +Provides authentication using Azure Managed Identity. + +## Members + +### Constructors + +#### ManagedIdentityCredentialProvider(string clientId) + +`ManagedIdentityCredentialProvider(string clientId)` + +Creates a new managed identity credential provider. + +- Param `clientId`: Optional client ID for user-assigned managed identity. +Leave null for system-assigned managed identity. + + +### Methods + +#### CreateServiceClientAsync + +`Task CreateServiceClientAsync(string environmentUrl, CancellationToken cancellationToken, bool forceInteractive)` + +Creates an authenticated ServiceClient for the specified environment URL. + +- Param `environmentUrl`: The Dataverse environment URL. + +- Param `cancellationToken`: Cancellation token. + +- Param `forceInteractive`: If true, skip silent auth and prompt user directly. Use for profile creation. + +- Returns: An authenticated ServiceClient. + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### FromProfile + +`ManagedIdentityCredentialProvider FromProfile(AuthProfile profile)` + +Creates a provider from an auth profile. + +- Param `profile`: The auth profile. + +- Returns: A new provider instance. + +#### GetCachedTokenInfoAsync + +`Task GetCachedTokenInfoAsync(string environmentUrl, CancellationToken cancellationToken)` + +Gets cached token information without triggering interactive authentication. +Queries the MSAL token cache to determine current token state. + +- Param `environmentUrl`: The Dataverse environment URL to check token for. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Token information if a valid cached token exists, null if token is expired or not cached. + + +### Properties + +#### AccessToken + +`string AccessToken { get; }` + +Gets the access token from the last authentication. +Available after successful authentication. Used for extracting JWT claims. + +#### AuthMethod + +`AuthMethod AuthMethod { get; }` + +Gets the authentication method this provider handles. + +#### HomeAccountId + +`string HomeAccountId { get; }` + +Gets the MSAL home account identifier. +Format: {objectId}.{tenantId} - uniquely identifies the account+tenant for token cache lookup. +Available after successful authentication. + +#### IdTokenClaims + +`ClaimsPrincipal IdTokenClaims { get; }` + +Gets the ID token claims from the last authentication (if available). +The ID token typically contains user claims like country that aren't in the access token. + +#### Identity + +`string Identity { get; }` + +Gets the identity string for display (e.g., username or app ID). +Available after successful authentication. + +#### ObjectId + +`string ObjectId { get; }` + +Gets the Entra Object ID (OID) from the authentication result. +Available after successful authentication. + +#### TenantId + +`string TenantId { get; }` + +Gets the tenant ID from the authentication result. +Available after successful authentication. + +#### TokenExpiresAt + +`Nullable TokenExpiresAt { get; }` + +Gets the token expiration time. +Available after successful authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/NativeCredentialStore.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/NativeCredentialStore.md new file mode 100644 index 0000000..7dd3ed5 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/NativeCredentialStore.md @@ -0,0 +1,101 @@ + + +# NativeCredentialStore + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `ISecureCredentialStore`, `IDisposable` + +## Summary + +Provides secure, platform-native credential storage using OS credential managers. + +## Members + +### Constructors + +#### NativeCredentialStore(bool allowCleartextFallback) + +`NativeCredentialStore(bool allowCleartextFallback)` + +Creates a new native credential store using the default settings. + +- Param `allowCleartextFallback`: On Linux, opts the caller in to plaintext file storage when libsecret is unavailable. +Plaintext activation is double-gated: it requires BOTH this flag set to `true` +AND the `GCM_CREDENTIAL_STORE=plaintext` environment variable, preventing +accidental activation. Has no effect on Windows or macOS, where secure storage is +always available. This is intended for CI/CD environments without a keyring. + + +### Methods + +#### ClearAsync + +`Task ClearAsync(CancellationToken cancellationToken)` + +Clears all stored credentials. + +- Param `cancellationToken`: Cancellation token. + +#### Dispose + +`void Dispose()` + +Disposes resources used by this credential store. + +#### ExistsAsync + +`Task ExistsAsync(string applicationId, CancellationToken cancellationToken)` + +Checks if credentials exist for a service principal. + +- Param `applicationId`: The application (client) ID. + +- Param `cancellationToken`: Cancellation token. + +- Returns: True if credentials exist. + +#### GetAsync + +`Task GetAsync(string applicationId, CancellationToken cancellationToken)` + +Retrieves credentials for a service principal by application ID. + +- Param `applicationId`: The application (client) ID. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The stored credential, or null if not found. + +#### RemoveAsync + +`Task RemoveAsync(string applicationId, CancellationToken cancellationToken)` + +Removes credentials for a service principal. + +- Param `applicationId`: The application (client) ID. + +- Param `cancellationToken`: Cancellation token. + +- Returns: True if removed, false if not found. + +#### StoreAsync + +`Task StoreAsync(StoredCredential credential, CancellationToken cancellationToken)` + +Stores credentials for a service principal. + +- Param `credential`: The credential to store. + +- Param `cancellationToken`: Cancellation token. + + +### Properties + +#### IsCleartextCachingEnabled + +`bool IsCleartextCachingEnabled { get; }` + +Gets whether cleartext caching is enabled (Linux fallback). + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/PowerPlatformToken.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/PowerPlatformToken.md new file mode 100644 index 0000000..0ca3748 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/PowerPlatformToken.md @@ -0,0 +1,51 @@ + + +# PowerPlatformToken + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Represents an access token for Power Platform APIs. + +## Members + +### Methods + +#### IsExpired + +`bool IsExpired(int bufferMinutes)` + +Returns true if the token is expired or will expire within the buffer period. + +- Param `bufferMinutes`: Buffer time before expiration to consider expired. + + +### Properties + +#### AccessToken + +`string AccessToken { get; set; }` + +Gets the access token string. + +#### ExpiresOn + +`DateTimeOffset ExpiresOn { get; set; }` + +Gets the token expiration time. + +#### Identity + +`string Identity { get; set; }` + +Gets the identity that acquired the token (username or app ID). + +#### Resource + +`string Resource { get; set; }` + +Gets the resource the token is valid for. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/PowerPlatformTokenProvider.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/PowerPlatformTokenProvider.md new file mode 100644 index 0000000..f0a8e5b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/PowerPlatformTokenProvider.md @@ -0,0 +1,123 @@ + + +# PowerPlatformTokenProvider + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `IPowerPlatformTokenProvider`, `IDisposable` + +## Summary + +Provides access tokens for Power Platform REST APIs using MSAL. +Supports user-delegated (interactive, device code) and application (client credentials) flows. + +## Members + +### Constructors + +#### PowerPlatformTokenProvider(CloudEnvironment cloud, string tenantId, string username, string homeAccountId) + +`PowerPlatformTokenProvider(CloudEnvironment cloud, string tenantId, string username, string homeAccountId)` + +Creates a provider for user-delegated authentication (interactive/device code). + +- Param `cloud`: The cloud environment. + +- Param `tenantId`: Optional tenant ID. + +- Param `username`: Optional username for silent auth lookup. + +- Param `homeAccountId`: Optional MSAL home account identifier. + +#### PowerPlatformTokenProvider(string applicationId, string clientSecret, string tenantId, CloudEnvironment cloud) + +`PowerPlatformTokenProvider(string applicationId, string clientSecret, string tenantId, CloudEnvironment cloud)` + +Creates a provider for service principal (client credentials) authentication. + +- Param `applicationId`: The application (client) ID. + +- Param `clientSecret`: The client secret. + +- Param `tenantId`: The tenant ID. + +- Param `cloud`: The cloud environment. + + +### Methods + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### FromProfile + +`PowerPlatformTokenProvider FromProfile(AuthProfile profile)` + +Creates a provider from an auth profile for user-delegated authentication. + +- Param `profile`: The auth profile. + +- Returns: A new provider instance. + +#### FromProfileWithSecret + +`PowerPlatformTokenProvider FromProfileWithSecret(AuthProfile profile, string clientSecret)` + +Creates a provider from an auth profile with client secret for SPN authentication. + +- Param `profile`: The auth profile. + +- Param `clientSecret`: The client secret. + +- Returns: A new provider instance. + +#### GetFlowApiTokenAsync + +`Task GetFlowApiTokenAsync(CancellationToken cancellationToken)` + +Acquires an access token for the Flow API using the correct service.powerapps.com scope. +Use this method for Flow API and Connections API operations, which require the +service.powerapps.com audience rather than api.flow.microsoft.com. + +- Param `cancellationToken`: Cancellation token. + +- Returns: A valid access token with service.powerapps.com audience. + +#### GetPowerAppsTokenAsync + +`Task GetPowerAppsTokenAsync(CancellationToken cancellationToken)` + +Acquires an access token for the Power Apps API. +Resource: https://api.powerapps.com (varies by cloud). + +- Param `cancellationToken`: Cancellation token. + +- Returns: A valid access token. + +#### GetPowerAutomateTokenAsync + +`Task GetPowerAutomateTokenAsync(CancellationToken cancellationToken)` + +Acquires an access token for the Power Automate (Flow) API. +Resource: https://api.flow.microsoft.com (varies by cloud). + +- Param `cancellationToken`: Cancellation token. + +- Returns: A valid access token. + +#### GetTokenForResourceAsync + +`Task GetTokenForResourceAsync(string resource, CancellationToken cancellationToken)` + +Acquires an access token for the specified Power Platform resource. + +- Param `resource`: The resource URL (e.g., https://api.powerapps.com). + +- Param `cancellationToken`: Cancellation token. + +- Returns: A valid access token. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/PreAuthDialogResult.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/PreAuthDialogResult.md new file mode 100644 index 0000000..a73ccb1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/PreAuthDialogResult.md @@ -0,0 +1,35 @@ + + +# PreAuthDialogResult + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Result of the pre-authentication dialog shown before browser auth. + +## Members + +### Fields + +#### Cancel + +`PreAuthDialogResult Cancel` + +Cancel authentication - return to TUI in limited mode. + +#### OpenBrowser + +`PreAuthDialogResult OpenBrowser` + +Proceed with browser authentication. + +#### UseDeviceCode + +`PreAuthDialogResult UseDeviceCode` + +Use device code authentication for this session instead. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/StoredCredential.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/StoredCredential.md new file mode 100644 index 0000000..000b4e5 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/StoredCredential.md @@ -0,0 +1,46 @@ + + +# StoredCredential + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Represents a credential stored in secure platform storage. + +## Members + +### Properties + +#### ApplicationId + +`string ApplicationId { get; set; }` + +Gets or sets the application (client) ID that owns this credential. + +#### CertificatePassword + +`string CertificatePassword { get; set; }` + +Gets or sets the certificate password for CertificateFile authentication. + +#### CertificatePath + +`string CertificatePath { get; set; }` + +Gets or sets the certificate path for CertificateFile authentication. + +#### ClientSecret + +`string ClientSecret { get; set; }` + +Gets or sets the client secret for ClientSecret authentication. + +#### Password + +`string Password { get; set; }` + +Gets or sets the password for UsernamePassword authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/TokenCacheManager.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/TokenCacheManager.md new file mode 100644 index 0000000..7cc8f3e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/TokenCacheManager.md @@ -0,0 +1,25 @@ + + +# TokenCacheManager + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Manages token cache operations including clearing cached credentials. + +## Members + +### Methods + +#### ClearAllCachesAsync + +`Task ClearAllCachesAsync(string tokenCachePath)` + +Clears the MSAL file-based token cache. + +- Param `tokenCachePath`: Optional path to the token cache file. If null, uses the default global path. +Pass a custom path when using isolated test directories to avoid clearing production cache. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/UsernamePasswordCredentialProvider.md b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/UsernamePasswordCredentialProvider.md new file mode 100644 index 0000000..65cfc1c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Credentials/UsernamePasswordCredentialProvider.md @@ -0,0 +1,126 @@ + + +# UsernamePasswordCredentialProvider + +- Namespace: `PPDS.Auth.Credentials` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `ICredentialProvider`, `IDisposable` + +## Summary + +Provides authentication using username and password (ROPC flow). + +## Members + +### Constructors + +#### UsernamePasswordCredentialProvider(string username, string password, CloudEnvironment cloud, string tenantId) + +`UsernamePasswordCredentialProvider(string username, string password, CloudEnvironment cloud, string tenantId)` + +Creates a new username/password credential provider. + +- Param `username`: The username. + +- Param `password`: The password. + +- Param `cloud`: The cloud environment. + +- Param `tenantId`: Optional tenant ID. + + +### Methods + +#### CreateServiceClientAsync + +`Task CreateServiceClientAsync(string environmentUrl, CancellationToken cancellationToken, bool forceInteractive)` + +Creates an authenticated ServiceClient for the specified environment URL. + +- Param `environmentUrl`: The Dataverse environment URL. + +- Param `cancellationToken`: Cancellation token. + +- Param `forceInteractive`: If true, skip silent auth and prompt user directly. Use for profile creation. + +- Returns: An authenticated ServiceClient. + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### GetCachedTokenInfoAsync + +`Task GetCachedTokenInfoAsync(string environmentUrl, CancellationToken cancellationToken)` + +Gets cached token information without triggering interactive authentication. +Queries the MSAL token cache to determine current token state. + +- Param `environmentUrl`: The Dataverse environment URL to check token for. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Token information if a valid cached token exists, null if token is expired or not cached. + + +### Properties + +#### AccessToken + +`string AccessToken { get; }` + +Gets the access token from the last authentication. +Available after successful authentication. Used for extracting JWT claims. + +#### AuthMethod + +`AuthMethod AuthMethod { get; }` + +Gets the authentication method this provider handles. + +#### HomeAccountId + +`string HomeAccountId { get; }` + +Gets the MSAL home account identifier. +Format: {objectId}.{tenantId} - uniquely identifies the account+tenant for token cache lookup. +Available after successful authentication. + +#### IdTokenClaims + +`ClaimsPrincipal IdTokenClaims { get; }` + +Gets the ID token claims from the last authentication (if available). +The ID token typically contains user claims like country that aren't in the access token. + +#### Identity + +`string Identity { get; }` + +Gets the identity string for display (e.g., username or app ID). +Available after successful authentication. + +#### ObjectId + +`string ObjectId { get; }` + +Gets the Entra Object ID (OID) from the authentication result. +Available after successful authentication. + +#### TenantId + +`string TenantId { get; }` + +Gets the tenant ID from the authentication result. +Available after successful authentication. + +#### TokenExpiresAt + +`Nullable TokenExpiresAt { get; }` + +Gets the token expiration time. +Available after successful authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/DependencyInjection/ServiceCollectionExtensions.md b/docs/reference/libraries/docs/reference/libraries/Auth/DependencyInjection/ServiceCollectionExtensions.md new file mode 100644 index 0000000..1e717e4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/DependencyInjection/ServiceCollectionExtensions.md @@ -0,0 +1,28 @@ + + +# ServiceCollectionExtensions + +- Namespace: `PPDS.Auth.DependencyInjection` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Extension methods for registering PPDS Auth services with dependency injection. + +## Members + +### Methods + +#### AddAuthServices + +`IServiceCollection AddAuthServices(IServiceCollection services)` + +Registers PPDS Auth connection-independent services as singletons. +Call this once per DI container — stores are file-based singletons +that should be shared across the application lifetime. + +- Param `services`: The service collection to add services to. + +- Returns: The service collection for chaining. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/AmbiguousMatchException.md b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/AmbiguousMatchException.md new file mode 100644 index 0000000..ee0e29b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/AmbiguousMatchException.md @@ -0,0 +1,27 @@ + + +# AmbiguousMatchException + +- Namespace: `PPDS.Auth.Discovery` +- Assembly: `PPDS.Auth` +- Kind: Class +- Base: `Exception` +- Implements: `ISerializable` + +## Summary + +Exception thrown when multiple environments match a given identifier. +For example, when searching by display name and multiple environments have similar names. + +## Members + +### Constructors + +#### AmbiguousMatchException(string message) + +`AmbiguousMatchException(string message)` + +Creates a new AmbiguousMatchException. + +- Param `message`: A message describing which environments matched ambiguously. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/DiscoveredEnvironment.md b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/DiscoveredEnvironment.md new file mode 100644 index 0000000..d60836e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/DiscoveredEnvironment.md @@ -0,0 +1,128 @@ + + +# DiscoveredEnvironment + +- Namespace: `PPDS.Auth.Discovery` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Represents an environment discovered via the Global Discovery Service. + +## Members + +### Methods + +#### ToString + +`string ToString()` + +Returns a string representation of the environment. + + +### Properties + +#### ApiUrl + +`string ApiUrl { get; set; }` + +Gets or sets the API URL for connecting to Dataverse. + +#### EnvironmentId + +`string EnvironmentId { get; set; }` + +Gets or sets the Power Platform environment ID. + +#### EnvironmentType + +`string EnvironmentType { get; }` + +Gets the environment type as a string. +Maps from Microsoft.Xrm.Sdk.Organization.OrganizationType enum values. + +#### FriendlyName + +`string FriendlyName { get; set; }` + +Gets or sets the friendly display name. + +#### Id + +`Guid Id { get; set; }` + +Gets or sets the environment ID (OrganizationId). + +#### IsEnabled + +`bool IsEnabled { get; }` + +Gets whether this environment is enabled. + +#### IsTrial + +`bool IsTrial { get; }` + +Gets whether this is a trial environment. + +#### IsUserSysAdmin + +`bool IsUserSysAdmin { get; set; }` + +Gets or sets whether the calling user has system administrator role. + +#### OrganizationType + +`int OrganizationType { get; set; }` + +Gets or sets the organization type. + +#### Region + +`string Region { get; set; }` + +Gets or sets the region code (e.g., "NAM", "EUR"). + +#### State + +`int State { get; set; }` + +Gets or sets the environment state (0 = enabled, 1 = disabled). + +#### TenantId + +`Nullable TenantId { get; set; }` + +Gets or sets the tenant ID. + +#### TrialExpirationDate + +`Nullable TrialExpirationDate { get; set; }` + +Gets or sets the trial expiration date (if applicable). + +#### UniqueName + +`string UniqueName { get; set; }` + +Gets or sets the unique name for the instance. + +#### Url + +`string Url { get; set; }` + +Gets or sets the application URL. + +#### UrlName + +`string UrlName { get; set; }` + +Gets or sets the URL name (subdomain part). + +#### Version + +`string Version { get; set; }` + +Gets or sets the environment version. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/EnvironmentResolutionResult.md b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/EnvironmentResolutionResult.md new file mode 100644 index 0000000..5faf4a6 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/EnvironmentResolutionResult.md @@ -0,0 +1,55 @@ + + +# EnvironmentResolutionResult + +- Namespace: `PPDS.Auth.Discovery` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Result of an environment resolution attempt. + +## Members + +### Methods + +#### Failed + +`EnvironmentResolutionResult Failed(string errorMessage)` + +Creates a failed result. + +#### Succeeded + +`EnvironmentResolutionResult Succeeded(EnvironmentInfo environment, ResolutionMethod method)` + +Creates a successful result. + + +### Properties + +#### Environment + +`EnvironmentInfo Environment { get; set; }` + +Gets the resolved environment info (null if failed). + +#### ErrorMessage + +`string ErrorMessage { get; set; }` + +Gets the error message (null if successful). + +#### Method + +`ResolutionMethod Method { get; set; }` + +Gets the method used to resolve the environment. + +#### Success + +`bool Success { get; set; }` + +Gets whether the resolution was successful. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/EnvironmentResolutionService.md b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/EnvironmentResolutionService.md new file mode 100644 index 0000000..286ad01 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/EnvironmentResolutionService.md @@ -0,0 +1,50 @@ + + +# EnvironmentResolutionService + +- Namespace: `PPDS.Auth.Discovery` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `IDisposable` + +## Summary + +Service for resolving environments using a multi-layer strategy. + +## Members + +### Constructors + +#### EnvironmentResolutionService(AuthProfile profile, Action deviceCodeCallback, ISecureCredentialStore credentialStore) + +`EnvironmentResolutionService(AuthProfile profile, Action deviceCodeCallback, ISecureCredentialStore credentialStore)` + +Creates a new environment resolution service. + +- Param `profile`: The auth profile to use for resolution. + +- Param `deviceCodeCallback`: Optional callback for device code display. + +- Param `credentialStore`: Optional secure credential store for looking up secrets. + + +### Methods + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### ResolveAsync + +`Task ResolveAsync(string identifier, CancellationToken cancellationToken)` + +Resolves an environment by identifier using the multi-layer strategy. + +- Param `identifier`: The environment identifier (URL, name, ID, etc.). + +- Param `cancellationToken`: Cancellation token. + +- Returns: A result containing the resolved environment info on success, or an error message on failure. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/EnvironmentResolver.md b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/EnvironmentResolver.md new file mode 100644 index 0000000..f5de7df --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/EnvironmentResolver.md @@ -0,0 +1,40 @@ + + +# EnvironmentResolver + +- Namespace: `PPDS.Auth.Discovery` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Resolves an environment from a collection by various criteria. + +## Members + +### Methods + +#### Resolve + +`DiscoveredEnvironment Resolve(IReadOnlyList environments, string identifier)` + +Resolves an environment by identifier (name, URL, or ID). + +- Param `environments`: The collection of environments to search. + +- Param `identifier`: The identifier to match (friendly name, unique name, URL, or ID). + +- Returns: The matching environment, or null if not found. + +#### ResolveByUrl + +`DiscoveredEnvironment ResolveByUrl(IReadOnlyList environments, string url)` + +Resolves an environment by URL only. + +- Param `environments`: The collection of environments to search. + +- Param `url`: The URL to match. + +- Returns: The matching environment, or null if not found. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/GlobalDiscoveryService.md b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/GlobalDiscoveryService.md new file mode 100644 index 0000000..2a6ef51 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/GlobalDiscoveryService.md @@ -0,0 +1,83 @@ + + +# GlobalDiscoveryService + +- Namespace: `PPDS.Auth.Discovery` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `IGlobalDiscoveryService`, `IDisposable` + +## Summary + +Service for discovering Dataverse environments via the Global Discovery Service. + +## Members + +### Constructors + +#### GlobalDiscoveryService(CloudEnvironment cloud, string tenantId, string homeAccountId, Nullable preferredAuthMethod, Action deviceCodeCallback) + +`GlobalDiscoveryService(CloudEnvironment cloud, string tenantId, string homeAccountId, Nullable preferredAuthMethod, Action deviceCodeCallback)` + +Creates a new GlobalDiscoveryService. + +- Param `cloud`: The cloud environment to use. + +- Param `tenantId`: Optional tenant ID. + +- Param `homeAccountId`: Optional MSAL home account identifier for precise account lookup. + +- Param `preferredAuthMethod`: Optional preferred auth method from profile. + +- Param `deviceCodeCallback`: Optional callback for device code display. + + +### Methods + +#### DiscoverEnvironmentsAsync + +`Task> DiscoverEnvironmentsAsync(CancellationToken cancellationToken)` + +Discovers all environments accessible to the authenticated user. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Collection of discovered environments. + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### FromProfile + +`GlobalDiscoveryService FromProfile(AuthProfile profile, Action deviceCodeCallback)` + +Creates a GlobalDiscoveryService from an auth profile. + +- Param `profile`: The auth profile. + +- Param `deviceCodeCallback`: Optional callback for device code display. + +- Returns: A new service instance. + +#### SupportsGlobalDiscovery + +`bool SupportsGlobalDiscovery(AuthMethod authMethod)` + +Checks if an authentication method supports Global Discovery. + +- Param `authMethod`: The authentication method to check. + +- Returns: True if the method can be used with Global Discovery; otherwise false. + + +### Properties + +#### CapturedHomeAccountId + +`string CapturedHomeAccountId { get; }` + +Gets the HomeAccountId captured during interactive authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/IGlobalDiscoveryService.md b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/IGlobalDiscoveryService.md new file mode 100644 index 0000000..d82cd58 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/IGlobalDiscoveryService.md @@ -0,0 +1,26 @@ + + +# IGlobalDiscoveryService + +- Namespace: `PPDS.Auth.Discovery` +- Assembly: `PPDS.Auth` +- Kind: Interface + +## Summary + +Service for discovering Dataverse environments via the Global Discovery Service. + +## Members + +### Methods + +#### DiscoverEnvironmentsAsync + +`Task> DiscoverEnvironmentsAsync(CancellationToken cancellationToken)` + +Discovers all environments accessible to the authenticated user. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Collection of discovered environments. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/ResolutionMethod.md b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/ResolutionMethod.md new file mode 100644 index 0000000..f24486e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Discovery/ResolutionMethod.md @@ -0,0 +1,29 @@ + + +# ResolutionMethod + +- Namespace: `PPDS.Auth.Discovery` +- Assembly: `PPDS.Auth` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Method used to resolve an environment. + +## Members + +### Fields + +#### DirectConnection + +`ResolutionMethod DirectConnection` + +Resolved via direct Dataverse connection. + +#### GlobalDiscovery + +`ResolutionMethod GlobalDiscovery` + +Resolved via Global Discovery Service. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/EnvironmentVariableAuth.md b/docs/reference/libraries/docs/reference/libraries/Auth/EnvironmentVariableAuth.md new file mode 100644 index 0000000..f79bccd --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/EnvironmentVariableAuth.md @@ -0,0 +1,57 @@ + + +# EnvironmentVariableAuth + +- Namespace: `PPDS.Auth` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Reads authentication configuration from environment variables for CI/CD scenarios. + +## Members + +### Methods + +#### TryCreateProfile + +`Nullable> TryCreateProfile()` + +Returns a synthetic AuthProfile and client secret from environment variables, +or null if none are set. +Throws AuthenticationException if partially configured (1-3 of 4 required vars). + + +### Fields + +#### ClientIdVar + +`string ClientIdVar` + +Environment variable name for the application (client) ID. + +#### ClientSecretVar + +`string ClientSecretVar` + +Environment variable name for the client secret. + +#### CloudVar + +`string CloudVar` + +Environment variable name for the cloud environment (optional, defaults to Public). + +#### EnvironmentUrlVar + +`string EnvironmentUrlVar` + +Environment variable name for the Dataverse environment URL. + +#### TenantIdVar + +`string TenantIdVar` + +Environment variable name for the tenant ID. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Pooling/ConnectionResolver.md b/docs/reference/libraries/docs/reference/libraries/Auth/Pooling/ConnectionResolver.md new file mode 100644 index 0000000..88f25e0 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Pooling/ConnectionResolver.md @@ -0,0 +1,106 @@ + + +# ConnectionResolver + +- Namespace: `PPDS.Auth.Pooling` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `IDisposable` + +## Summary + +Resolves profile names to authenticated connections. + +## Members + +### Constructors + +#### ConnectionResolver(ProfileStore store, Action deviceCodeCallback, ISecureCredentialStore credentialStore) + +`ConnectionResolver(ProfileStore store, Action deviceCodeCallback, ISecureCredentialStore credentialStore)` + +Creates a new ConnectionResolver. + +- Param `store`: The profile store (optional, uses default if null). + +- Param `deviceCodeCallback`: Optional callback for device code display. + +- Param `credentialStore`: Optional secure credential store for looking up secrets. + + +### Methods + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### ParseProfileString + +`IReadOnlyList ParseProfileString(string profileString)` + +Parses a comma-separated profile string into individual names. + +- Param `profileString`: Comma-separated profile names. + +- Returns: List of profile names. + +#### ResolveActiveAsync + +`Task ResolveActiveAsync(string environmentOverride, CancellationToken cancellationToken)` + +Resolves the active profile to a ServiceClient. + +- Param `environmentOverride`: Optional environment URL override. + +- Param `cancellationToken`: Cancellation token. + +- Returns: An authenticated ServiceClient. + +#### ResolveAsync + +`Task ResolveAsync(string profileName, string environmentOverride, CancellationToken cancellationToken)` + +Resolves a profile or uses the active profile if none specified. + +- Param `profileName`: Optional profile name (uses active if null). + +- Param `environmentOverride`: Optional environment URL override. + +- Param `cancellationToken`: Cancellation token. + +- Returns: An authenticated ServiceClient. + +#### ResolveByNameAsync + +`Task ResolveByNameAsync(string profileName, string environmentOverride, CancellationToken cancellationToken)` + +Resolves a named profile to a ServiceClient. + +- Param `profileName`: The profile name. + +- Param `environmentOverride`: Optional environment URL override. + +- Param `cancellationToken`: Cancellation token. + +- Returns: An authenticated ServiceClient. + +#### ResolveMultipleAsync + +`Task> ResolveMultipleAsync(IEnumerable profileNames, string environmentOverride, int maxPoolSizePerProfile, string environmentDisplayName, CancellationToken cancellationToken)` + +Resolves multiple profile names to connection sources for pooling. + +- Param `profileNames`: The profile names (comma-separated or array). + +- Param `environmentOverride`: Optional environment URL override. + +- Param `maxPoolSizePerProfile`: Maximum pool size per profile. + +- Param `environmentDisplayName`: Optional environment display name for connection naming. + +- Param `cancellationToken`: Cancellation token. + +- Returns: List of connection sources. Caller takes ownership and is responsible for disposal. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Pooling/ProfileConnectionSource.md b/docs/reference/libraries/docs/reference/libraries/Auth/Pooling/ProfileConnectionSource.md new file mode 100644 index 0000000..a7d3eac --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Pooling/ProfileConnectionSource.md @@ -0,0 +1,115 @@ + + +# ProfileConnectionSource + +- Namespace: `PPDS.Auth.Pooling` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `IDisposable` + +## Summary + +Connection source that creates ServiceClients from an authentication profile. +Implements IConnectionSource pattern for use with connection pools. + +## Members + +### Constructors + +#### ProfileConnectionSource(AuthProfile profile, string environmentUrl, int maxPoolSize, Action deviceCodeCallback, Func, PreAuthDialogResult> beforeInteractiveAuth, string environmentDisplayName, ISecureCredentialStore credentialStore, string clientSecretOverride, Action onProfileUpdated) + +`ProfileConnectionSource(AuthProfile profile, string environmentUrl, int maxPoolSize, Action deviceCodeCallback, Func, PreAuthDialogResult> beforeInteractiveAuth, string environmentDisplayName, ISecureCredentialStore credentialStore, string clientSecretOverride, Action onProfileUpdated)` + +Creates a new ProfileConnectionSource. + +- Param `profile`: The authentication profile. + +- Param `environmentUrl`: The Dataverse environment URL. + +- Param `maxPoolSize`: Maximum pool size (default: 52 per Microsoft recommendations). + +- Param `deviceCodeCallback`: Optional callback for device code display. + +- Param `beforeInteractiveAuth`: Optional callback invoked before browser opens for interactive auth. + Returns the user's choice (OpenBrowser, UseDeviceCode, or Cancel). + +- Param `environmentDisplayName`: Optional environment display name for connection naming. + +- Param `credentialStore`: Optional secure credential store for looking up secrets. + +- Param `clientSecretOverride`: Optional client secret override (bypasses env var and store lookups). + +- Param `onProfileUpdated`: Optional callback invoked when profile metadata is updated (e.g., HomeAccountId after auth). + + +### Methods + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### FromProfile + +`ProfileConnectionSource FromProfile(AuthProfile profile, int maxPoolSize, Action deviceCodeCallback, Func, PreAuthDialogResult> beforeInteractiveAuth, ISecureCredentialStore credentialStore, Action onProfileUpdated)` + +Creates a ProfileConnectionSource from a profile, using the profile's environment. + +- Param `profile`: The authentication profile (must have environment set). + +- Param `maxPoolSize`: Maximum pool size. + +- Param `deviceCodeCallback`: Optional callback for device code display. + +- Param `beforeInteractiveAuth`: Optional callback invoked before browser opens for interactive auth. + Returns the user's choice (OpenBrowser, UseDeviceCode, or Cancel). + +- Param `credentialStore`: Optional secure credential store for looking up secrets. + +- Param `onProfileUpdated`: Optional callback invoked when profile metadata is updated (e.g., HomeAccountId after auth). + +- Returns: A new connection source. + +#### GetSeedClient + +`ServiceClient GetSeedClient()` + +Gets the seed ServiceClient for cloning. + +- Returns: An authenticated, ready-to-use ServiceClient. + +#### InvalidateSeed + +`void InvalidateSeed()` + +Invalidates the cached seed client, forcing fresh authentication on next use. + + +### Properties + +#### EnvironmentUrl + +`string EnvironmentUrl { get; }` + +Gets the environment URL. + +#### MaxPoolSize + +`int MaxPoolSize { get; }` + +Gets the maximum number of pooled connections for this source. + +#### Name + +`string Name { get; }` + +Gets the unique name for this connection source. +Includes identity and environment display name when available. + +#### Profile + +`AuthProfile Profile { get; }` + +Gets the authentication profile. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/AuthMethod.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/AuthMethod.md new file mode 100644 index 0000000..b8c9f47 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/AuthMethod.md @@ -0,0 +1,79 @@ + + +# AuthMethod + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Authentication method for a profile. + +## Members + +### Fields + +#### AzureDevOpsFederated + +`AuthMethod AzureDevOpsFederated` + +Azure DevOps OIDC (workload identity federation). +For Azure DevOps CI/CD pipelines. + +#### CertificateFile + +`AuthMethod CertificateFile` + +Client ID and certificate from file (Service Principal). +More secure than ClientSecret. + +#### CertificateStore + +`AuthMethod CertificateStore` + +Client ID and certificate from Windows certificate store (Service Principal). +Windows only. + +#### ClientSecret + +`AuthMethod ClientSecret` + +Client ID and client secret (Service Principal). +For production server-to-server scenarios. + +#### DeviceCode + +`AuthMethod DeviceCode` + +Device code flow (fallback for headless environments). +User visits URL and enters code to authenticate. + +#### GitHubFederated + +`AuthMethod GitHubFederated` + +GitHub Actions OIDC (workload identity federation). +For GitHub Actions CI/CD pipelines. + +#### InteractiveBrowser + +`AuthMethod InteractiveBrowser` + +Interactive browser flow (default for desktop). +Opens system browser for authentication. + +#### ManagedIdentity + +`AuthMethod ManagedIdentity` + +Azure Managed Identity. +For Azure-hosted workloads (VMs, App Service, AKS, etc.). + +#### UsernamePassword + +`AuthMethod UsernamePassword` + +Username and password (ROPC flow). + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/AuthProfile.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/AuthProfile.md new file mode 100644 index 0000000..1e1e96f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/AuthProfile.md @@ -0,0 +1,181 @@ + + +# AuthProfile + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +An authentication profile containing credentials and environment binding. + +## Members + +### Methods + +#### Clone + +`AuthProfile Clone()` + +Creates a deep copy of this profile. + +#### ToString + +`string ToString()` + +Returns a string representation of the profile. + +#### Validate + +`void Validate()` + +Validates that the profile has required fields for its auth method. + + +### Properties + +#### ApplicationId + +`string ApplicationId { get; set; }` + +Gets or sets the application (client) ID. +Required for service principal authentication. + +#### AuthMethod + +`AuthMethod AuthMethod { get; set; }` + +Gets or sets the authentication method. + +#### Authority + +`string Authority { get; set; }` + +Gets or sets the authority URL for authentication. +Full URL like "https://login.microsoftonline.com/{tenantId}". + +#### CertificatePath + +`string CertificatePath { get; set; }` + +Gets or sets the certificate file path. +For CertificateFile authentication. + +#### CertificateStoreLocation + +`string CertificateStoreLocation { get; set; }` + +Gets or sets the certificate store location. +For CertificateStore authentication. Default: CurrentUser + +#### CertificateStoreName + +`string CertificateStoreName { get; set; }` + +Gets or sets the certificate store name. +For CertificateStore authentication. Default: My + +#### CertificateThumbprint + +`string CertificateThumbprint { get; set; }` + +Gets or sets the certificate thumbprint. +For CertificateStore authentication. + +#### Cloud + +`CloudEnvironment Cloud { get; set; }` + +Gets or sets the cloud environment. + +#### CreatedAt + +`DateTimeOffset CreatedAt { get; set; }` + +Gets or sets when the profile was created. + +#### DisplayIdentifier + +`string DisplayIdentifier { get; }` + +Gets the display identifier (always includes index, e.g., "[1] MyProfile" or "[1]"). + +#### Environment + +`EnvironmentInfo Environment { get; set; }` + +Gets or sets the bound environment. +Null for universal profiles (no environment selected). + +#### HasEnvironment + +`bool HasEnvironment { get; }` + +Gets whether this profile has an environment bound. + +#### HasName + +`bool HasName { get; }` + +Gets whether this profile has a name. + +#### HomeAccountId + +`string HomeAccountId { get; set; }` + +Gets or sets the MSAL home account identifier. +Format: {objectId}.{tenantId} - uniquely identifies the account+tenant for token cache lookup. + +#### IdentityDisplay + +`string IdentityDisplay { get; }` + +Gets the identity string for display (username or application ID). + +#### Index + +`int Index { get; set; }` + +Gets or sets the profile index (1-based, assigned on creation). + +#### LastUsedAt + +`Nullable LastUsedAt { get; set; }` + +Gets or sets when the profile was last used. + +#### Name + +`string Name { get; set; }` + +Gets or sets the profile name (optional, max 30 characters). +Null for unnamed profiles (reference by index only). + +#### ObjectId + +`string ObjectId { get; set; }` + +Gets or sets the Entra ID Object ID (user or service principal). +Populated after successful authentication. + +#### Puid + +`string Puid { get; set; }` + +Gets or sets the user's PUID from the JWT 'puid' claim. + +#### TenantId + +`string TenantId { get; set; }` + +Gets or sets the tenant ID. +Required for app-based authentication. + +#### Username + +`string Username { get; set; }` + +Gets or sets the username for device code or password auth. +Populated after successful authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/BypassPluginMode.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/BypassPluginMode.md new file mode 100644 index 0000000..479ee0c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/BypassPluginMode.md @@ -0,0 +1,41 @@ + + +# BypassPluginMode + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Which plugin types to bypass during DML operations. + +## Members + +### Fields + +#### All + +`BypassPluginMode All` + +Bypass all custom plugins. + +#### Asynchronous + +`BypassPluginMode Asynchronous` + +Bypass asynchronous plugins only. + +#### None + +`BypassPluginMode None` + +Execute all plugins normally. + +#### Synchronous + +`BypassPluginMode Synchronous` + +Bypass synchronous plugins only. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/CrossEnvironmentDmlPolicy.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/CrossEnvironmentDmlPolicy.md new file mode 100644 index 0000000..a7af50b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/CrossEnvironmentDmlPolicy.md @@ -0,0 +1,35 @@ + + +# CrossEnvironmentDmlPolicy + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Cross-environment DML policy. + +## Members + +### Fields + +#### Allow + +`CrossEnvironmentDmlPolicy Allow` + +No additional confirmation beyond standard DML safety. + +#### Prompt + +`CrossEnvironmentDmlPolicy Prompt` + +Confirm each cross-env DML with source/target/count. + +#### ReadOnly + +`CrossEnvironmentDmlPolicy ReadOnly` + +Cross-env queries are SELECT only (default). + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/DateTimeMode.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/DateTimeMode.md new file mode 100644 index 0000000..0ad47e1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/DateTimeMode.md @@ -0,0 +1,35 @@ + + +# DateTimeMode + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +DateTime display mode for query results. + +## Members + +### Fields + +#### EnvironmentTimezone + +`DateTimeMode EnvironmentTimezone` + +Display all DateTimes in the connected environment's timezone. + +#### Local + +`DateTimeMode Local` + +Display all DateTimes in the local machine timezone. + +#### Utc + +`DateTimeMode Utc` + +Display all DateTimes in UTC. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentColor.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentColor.md new file mode 100644 index 0000000..ee2516d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentColor.md @@ -0,0 +1,96 @@ + + +# EnvironmentColor + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Named colors for environment theming. +Maps to 16-color terminal palette (works in TUI and VS Code). + +## Members + +### Fields + +#### Blue + +`EnvironmentColor Blue` + +Blue. + +#### BrightBlue + +`EnvironmentColor BrightBlue` + +Bright blue. + +#### BrightCyan + +`EnvironmentColor BrightCyan` + +Bright cyan. + +#### BrightGreen + +`EnvironmentColor BrightGreen` + +Bright green. + +#### BrightRed + +`EnvironmentColor BrightRed` + +Bright red. + +#### BrightYellow + +`EnvironmentColor BrightYellow` + +Bright yellow. + +#### Brown + +`EnvironmentColor Brown` + +Brown — typically used for Sandbox environments. + +#### Cyan + +`EnvironmentColor Cyan` + +Cyan — typically used for Trial environments. + +#### Gray + +`EnvironmentColor Gray` + +Gray — the default fallback color. + +#### Green + +`EnvironmentColor Green` + +Green — typically used for Development environments. + +#### Red + +`EnvironmentColor Red` + +Red — typically used for Production environments. + +#### White + +`EnvironmentColor White` + +White. + +#### Yellow + +`EnvironmentColor Yellow` + +Yellow — typically used for Test environments. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentConfig.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentConfig.md new file mode 100644 index 0000000..d20333d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentConfig.md @@ -0,0 +1,81 @@ + + +# EnvironmentConfig + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +User configuration for a specific Dataverse environment. +Stores label, type classification, and color override. + +## Members + +### Methods + +#### NormalizeUrl + +`string NormalizeUrl(string url)` + +Normalizes a URL for use as a lookup key (lowercase, ensures trailing slash). + + +### Properties + +#### Color + +`Nullable Color { get; set; }` + +Explicit color override for this specific environment. +Takes priority over type-based color. Null means use type default. + +#### DiscoveredType + +`string DiscoveredType { get; set; }` + +Raw environment type from the Discovery API (e.g., "Sandbox", "Developer", "Production"). +Stored separately from user Type override. Not user-editable. + +#### Label + +`string Label { get; set; }` + +Short label for status bar and tab display (e.g., "Contoso Dev"). +Null means use the environment's DisplayName. + +#### Profiles + +`List Profiles { get; set; }` + +Profile names that have accessed this environment. +Used to filter environments per-profile in the VS Code tree and TUI selector. + +#### Protection + +`Nullable Protection { get; set; }` + +Explicit protection level override. Null means auto-detect from Type. + +#### SafetySettings + +`QuerySafetySettings SafetySettings { get; set; }` + +Per-environment query safety settings (DML thresholds, execution options). +Null means use defaults for all settings. + +#### Type + +`Nullable Type { get; set; }` + +User-configured environment type override. +Drives protection levels and default color theming. +Null means auto-detect from DiscoveredType or URL heuristics. + +#### Url + +`string Url { get; set; }` + +Normalized environment URL (lowercase, trailing slash). This is the key. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentConfigCollection.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentConfigCollection.md new file mode 100644 index 0000000..14b8fcb --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentConfigCollection.md @@ -0,0 +1,37 @@ + + +# EnvironmentConfigCollection + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Root object for environments.json — holds per-environment configs and custom type defaults. + +## Members + +### Properties + +#### Environments + +`List Environments { get; set; }` + +Per-environment configurations keyed by normalized URL. + +#### TypeDefaults + +`Dictionary TypeDefaults { get; set; }` + +Custom type definitions with default colors. +Key is the EnvironmentType enum value, value is the default color. +Built-in types (Production, Sandbox, Development, Test, Trial) do not need entries here +unless overriding the built-in color. + +#### Version + +`int Version { get; set; }` + +Schema version for forward compatibility. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentConfigStore.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentConfigStore.md new file mode 100644 index 0000000..28fda62 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentConfigStore.md @@ -0,0 +1,84 @@ + + +# EnvironmentConfigStore + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `IDisposable` + +## Summary + +Manages persistent storage of environment configurations. + +## Members + +### Constructors + +#### EnvironmentConfigStore() + +`EnvironmentConfigStore()` + +Creates a store using the default environments file path. + +#### EnvironmentConfigStore(string filePath) + +`EnvironmentConfigStore(string filePath)` + +Creates a store using a custom file path. + + +### Methods + +#### ClearCache + +`void ClearCache()` + +Clears the in-memory cache, forcing a reload from disk on next access. + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### GetConfigAsync + +`Task GetConfigAsync(string url, CancellationToken ct)` + +Gets the config for a specific environment URL, or null if not configured. + +#### LoadAsync + +`Task LoadAsync(CancellationToken ct)` + +Loads the environment config collection, using cache if available. + +#### RemoveConfigAsync + +`Task RemoveConfigAsync(string url, CancellationToken ct)` + +Removes config for a specific environment URL. + +#### SaveAsync + +`Task SaveAsync(EnvironmentConfigCollection collection, CancellationToken ct)` + +Persists the environment config collection to disk. + +#### SaveConfigAsync + +`Task SaveConfigAsync(string url, string label, Nullable type, Nullable color, bool clearColor, string discoveredType, string profileName, CancellationToken ct)` + +Saves or updates config for a specific environment. Merges non-null fields. +Optionally links the environment to a profile name. + + +### Properties + +#### FilePath + +`string FilePath { get; }` + +Gets the file path used for persistent storage. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentInfo.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentInfo.md new file mode 100644 index 0000000..3db97d6 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentInfo.md @@ -0,0 +1,90 @@ + + +# EnvironmentInfo + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Information about a Dataverse environment bound to a profile. + +## Members + +### Methods + +#### Clone + +`EnvironmentInfo Clone()` + +Creates a deep copy of this environment info. + +#### Create + +`EnvironmentInfo Create(string url, string displayName)` + +Creates a new instance with the minimum required information. + +- Param `url`: The environment URL. + +- Param `displayName`: The display name. + +- Returns: A new EnvironmentInfo instance. + +#### ToString + +`string ToString()` + +Returns a string representation of the environment. + + +### Properties + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the display name (friendly name). +Example: PPDS Demo - Dev + +#### EnvironmentId + +`string EnvironmentId { get; set; }` + +Gets or sets the Power Platform environment ID. + +#### OrganizationId + +`string OrganizationId { get; set; }` + +Gets or sets the organization ID (GUID). + +#### Region + +`string Region { get; set; }` + +Gets or sets the geographic region. +Example: NA, EMEA, APAC + +#### Type + +`string Type { get; set; }` + +Gets or sets the environment type. +Example: Sandbox, Production + +#### UniqueName + +`string UniqueName { get; set; }` + +Gets or sets the unique name. +Example: unq3a504f4385d7f01195c7000d3a5cc + +#### Url + +`string Url { get; set; }` + +Gets or sets the environment URL. +Example: https://orgcabef92d.crm.dynamics.com/ + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentType.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentType.md new file mode 100644 index 0000000..bcfe559 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/EnvironmentType.md @@ -0,0 +1,54 @@ + + +# EnvironmentType + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Classification of Dataverse environment types. +Drives protection levels and default color theming. + +## Members + +### Fields + +#### Development + +`EnvironmentType Development` + +Development environment — unrestricted DML. + +#### Production + +`EnvironmentType Production` + +Production environment — DML blocked by default, requires confirmation with preview. + +#### Sandbox + +`EnvironmentType Sandbox` + +Sandbox/staging environment — unrestricted DML. + +#### Test + +`EnvironmentType Test` + +Test/QA/UAT environment — unrestricted DML. + +#### Trial + +`EnvironmentType Trial` + +Trial environment — unrestricted DML. + +#### Unknown + +`EnvironmentType Unknown` + +Unknown or unconfigured — auto-detect from Discovery API or URL heuristics. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfileCollection.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfileCollection.md new file mode 100644 index 0000000..1ab11d3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfileCollection.md @@ -0,0 +1,168 @@ + + +# ProfileCollection + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Collection of authentication profiles with active profile tracking. + +## Members + +### Methods + +#### Add + +`void Add(AuthProfile profile, bool setAsActive)` + +Adds a profile to the collection. + +- Param `profile`: The profile to add. + +- Param `setAsActive`: Whether to set this as the active profile. + +#### Clear + +`void Clear()` + +Clears all profiles. + +#### Clone + +`ProfileCollection Clone()` + +Creates a deep copy of this collection with all profiles cloned. + +#### GetByIndex + +`AuthProfile GetByIndex(int index)` + +Gets a profile by index. + +- Param `index`: The profile index. + +- Returns: The profile, or null if not found. + +#### GetByName + +`AuthProfile GetByName(string name)` + +Gets a profile by name (case-insensitive). + +- Param `name`: The profile name. + +- Returns: The profile, or null if not found. + +#### GetByNameOrIndex + +`AuthProfile GetByNameOrIndex(string nameOrIndex)` + +Gets a profile by name or index string. + +- Param `nameOrIndex`: The profile name or index (as string), including bracket notation like "[1]" or full DisplayIdentifier like "[1] MyProfile". + +- Returns: The profile, or null if not found. + +#### IsNameInUse + +`bool IsNameInUse(string name, Nullable excludeIndex)` + +Checks if a profile name is already in use (case-insensitive). + +- Param `name`: The name to check. + +- Param `excludeIndex`: Optional index to exclude from check (for rename). + +- Returns: True if the name is in use. + +#### RemoveByIndex + +`bool RemoveByIndex(int index)` + +Removes a profile by index. + +- Param `index`: The profile index. + +- Returns: True if removed, false if not found. + +#### RemoveByName + +`bool RemoveByName(string name)` + +Removes a profile by name. + +- Param `name`: The profile name. + +- Returns: True if removed, false if not found. + +#### SetActiveByIndex + +`void SetActiveByIndex(int index)` + +Sets the active profile by index. + +- Param `index`: The profile index. + +#### SetActiveByName + +`void SetActiveByName(string name)` + +Sets the active profile by name. + +- Param `name`: The profile name. + + +### Properties + +#### ActiveProfile + +`AuthProfile ActiveProfile { get; }` + +Gets the active profile, or null if none is active. + +#### ActiveProfileIndex + +`Nullable ActiveProfileIndex { get; set; }` + +Gets or sets the index of the active profile. Primary tracking mechanism. + +#### ActiveProfileName + +`string ActiveProfileName { get; set; }` + +Gets or sets the name of the active profile. +Kept for backwards compatibility with v2 profiles.json files and for display purposes. + +#### All + +`IEnumerable All { get; }` + +Gets all profiles in index order. + +#### Count + +`int Count { get; }` + +Gets the count of profiles. + +#### NextIndex + +`int NextIndex { get; }` + +Gets the next available index. + +#### Profiles + +`List Profiles { get; set; }` + +Gets or sets the profiles list. + +#### Version + +`int Version { get; set; }` + +Storage format version. v2 uses array storage and index-based active profile tracking. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfileEncryption.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfileEncryption.md new file mode 100644 index 0000000..1e276bf --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfileEncryption.md @@ -0,0 +1,70 @@ + + +# ProfileEncryption + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Provides platform-specific encryption for sensitive profile data. + +## Members + +### Methods + +#### Decrypt + +`string Decrypt(string encryptedValue)` + +Decrypts an encrypted string value. + +- Param `encryptedValue`: The encrypted value (with or without prefix). + +- Returns: The decrypted value. + +#### Encrypt + +`string Encrypt(string value)` + +Encrypts a string value using platform-specific encryption. + +- Param `value`: The value to encrypt. + +- Returns: The encrypted value with `ENCRYPTED:` prefix on Windows, or a +`CLEARTEXT:`-prefixed base64 value on other platforms when +cleartext caching has been opted in. Returns an empty string when +`value` is null or empty. + +#### IsEncrypted + +`bool IsEncrypted(string value)` + +Checks if a value is encrypted (has the ENCRYPTED: or CLEARTEXT: prefix). + +- Param `value`: The value to check. + +- Returns: True if the value carries one of the known prefixes. + + +### Properties + +#### AllowCleartext + +`bool AllowCleartext { get; set; }` + +Process-wide override that, when set to true, allows cleartext +persistence on non-Windows platforms. Primarily used by tests. + + +### Fields + +#### AllowCleartextEnvVar + +`string AllowCleartextEnvVar` + +Environment variable that, when set to "1" or "true", allows storing +profile values as base64-encoded cleartext on platforms without +in-process encryption. Intended for CI/CD only. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfilePaths.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfilePaths.md new file mode 100644 index 0000000..390d579 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfilePaths.md @@ -0,0 +1,106 @@ + + +# ProfilePaths + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Provides platform-specific paths for profile storage. + +## Members + +### Methods + +#### EnsureDirectoryExists + +`void EnsureDirectoryExists()` + +Ensures the data directory exists. + + +### Properties + +#### CredentialCacheFile + +`string CredentialCacheFile { get; }` + +Gets the full path to the secure credential cache file. + +#### DataDirectory + +`string DataDirectory { get; }` + +Gets the PPDS data directory for the current platform. + +#### EnvironmentsFile + +`string EnvironmentsFile { get; }` + +Gets the full path to the environment configuration file. + +#### ProfilesFile + +`string ProfilesFile { get; }` + +Gets the full path to the profiles file. + +#### TokenCacheFile + +`string TokenCacheFile { get; }` + +Gets the full path to the MSAL token cache file. + +#### TuiStateFile + +`string TuiStateFile { get; }` + +Gets the full path to the TUI state persistence file. + + +### Fields + +#### AppName + +`string AppName` + +Application name used in paths. + +#### ConfigDirEnvVar + +`string ConfigDirEnvVar` + +Environment variable to override the data directory. + +#### CredentialCacheFileName + +`string CredentialCacheFileName` + +Secure credential cache file name. + +#### EnvironmentsFileName + +`string EnvironmentsFileName` + +Environment configuration file name. + +#### ProfilesFileName + +`string ProfilesFileName` + +Profile storage file name. + +#### TokenCacheFileName + +`string TokenCacheFileName` + +MSAL token cache file name. + +#### TuiStateFileName + +`string TuiStateFileName` + +TUI state persistence file name. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfileResolver.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfileResolver.md new file mode 100644 index 0000000..7aea31f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfileResolver.md @@ -0,0 +1,53 @@ + + +# ProfileResolver + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Resolves which profile to use based on the priority order: +1. Explicit profile name (CLI flag or API parameter) +2. PPDS_PROFILE environment variable +3. Global active profile from profiles.json + +## Members + +### Methods + +#### GetEffectiveProfileName + +`string GetEffectiveProfileName(string explicitProfile)` + +Gets the effective profile name to use, following the priority order: +1. Explicit profile (from CLI flag or API parameter) +2. PPDS_PROFILE environment variable +3. Returns null (caller should use global active profile) + +- Param `explicitProfile`: Profile explicitly specified by user (e.g., --profile flag). + +- Returns: The profile name to use, or null if the global active profile should be used. + +#### ResolveProfile + +`AuthProfile ResolveProfile(ProfileCollection collection, string explicitProfile)` + +Resolves the effective profile from a collection, following the priority order. + +- Param `collection`: The profile collection to search. + +- Param `explicitProfile`: Profile explicitly specified by user (e.g., --profile flag). + +- Returns: The resolved profile, or null if no matching profile found. + + +### Fields + +#### ProfileEnvironmentVariable + +`string ProfileEnvironmentVariable` + +Environment variable name for profile override. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfileStore.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfileStore.md new file mode 100644 index 0000000..070fa2d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProfileStore.md @@ -0,0 +1,124 @@ + + +# ProfileStore + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `IDisposable` + +## Summary + +Manages persistent storage of authentication profiles. + +## Members + +### Constructors + +#### ProfileStore(ILogger logger) + +`ProfileStore(ILogger logger)` + +Creates a new profile store using the default path. + +- Param `logger`: Optional logger for diagnostics. + +#### ProfileStore(string filePath, ILogger logger) + +`ProfileStore(string filePath, ILogger logger)` + +Creates a new profile store using a custom path. + +- Param `filePath`: The path to the profiles file. + +- Param `logger`: Optional logger for diagnostics. + + +### Methods + +#### ClearCache + +`void ClearCache()` + +Clears the cached collection, forcing a reload on next access. + +#### Delete + +`void Delete()` + +Deletes the profile storage file and clears the cache. + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### Load + +`ProfileCollection Load()` + +Loads the profile collection from disk (synchronous). + +- Returns: The profile collection. + +#### LoadAsync + +`Task LoadAsync(CancellationToken cancellationToken)` + +Loads the profile collection from disk. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The profile collection. + +#### Save + +`void Save(ProfileCollection collection)` + +Saves the profile collection to disk (synchronous). + +- Param `collection`: The collection to save. + +#### SaveAsync + +`Task SaveAsync(ProfileCollection collection, CancellationToken cancellationToken)` + +Saves the profile collection to disk. + +- Param `collection`: The collection to save. + +- Param `cancellationToken`: Cancellation token. + +#### UpdateProfileAsync + +`Task UpdateProfileAsync(string profileNameOrIndex, Action updateAction, CancellationToken cancellationToken)` + +Updates a specific profile using an update action. + +- Param `profileNameOrIndex`: The name or index (including bracket notation like "[1]") of the profile to update. + +- Param `updateAction`: Action to apply to the profile. + +- Param `cancellationToken`: Cancellation token. + +- Returns: True if the profile was found and updated, false otherwise. + + +### Properties + +#### FilePath + +`string FilePath { get; }` + +Gets the path to the profiles file. + + +### Fields + +#### CurrentVersion + +`int CurrentVersion` + +Current schema version. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProtectionLevel.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProtectionLevel.md new file mode 100644 index 0000000..441fd90 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/ProtectionLevel.md @@ -0,0 +1,35 @@ + + +# ProtectionLevel + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Environment protection level determining DML behavior. + +## Members + +### Fields + +#### Development + +`ProtectionLevel Development` + +Unrestricted DML. Sandbox and Developer environments. + +#### Production + +`ProtectionLevel Production` + +Block by default, require explicit confirmation with preview. Production and unknown environments. + +#### Test + +`ProtectionLevel Test` + +Warn per thresholds. Trial environments. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/QuerySafetySettings.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/QuerySafetySettings.md new file mode 100644 index 0000000..5f79313 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/QuerySafetySettings.md @@ -0,0 +1,119 @@ + + +# QuerySafetySettings + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Per-environment query safety settings. Stored in environment config JSON. +All settings have sensible defaults — null means "use default". + +## Members + +### Properties + +#### BypassCustomPlugins + +`BypassPluginMode BypassCustomPlugins { get; set; }` + +Bypass custom plugin execution. Default: None. + +#### BypassPowerAutomateFlows + +`bool BypassPowerAutomateFlows { get; set; }` + +Suppress Power Automate flow triggers on DML. Default: false. + +#### CrossEnvironmentDmlPolicy + +`CrossEnvironmentDmlPolicy CrossEnvironmentDmlPolicy { get; set; }` + +Cross-environment DML policy. Default: ReadOnly. + +#### DateTimeMode + +`DateTimeMode DateTimeMode { get; set; }` + +DateTime display mode. Default: UTC. + +#### DmlBatchSize + +`Nullable DmlBatchSize { get; set; }` + +Records per DML batch (1-1000). Default: 100. + +#### MaxPageRetrievals + +`Nullable MaxPageRetrievals { get; set; }` + +Maximum FetchXML pages fetched (0 = unlimited). Default: 200. + +#### MaxParallelism + +`Nullable MaxParallelism { get; set; }` + +Worker threads for DML (0 = auto). Default: 0. + +#### MaxResultRows + +`Nullable MaxResultRows { get; set; }` + +Maximum rows returned (0 = unlimited). Default: 0. + +#### PreventDeleteWithoutWhere + +`bool PreventDeleteWithoutWhere { get; set; }` + +Block DELETE without WHERE clause. Default: true. + +#### PreventUpdateWithoutWhere + +`bool PreventUpdateWithoutWhere { get; set; }` + +Block UPDATE without WHERE clause. Default: true. + +#### QueryTimeoutSeconds + +`Nullable QueryTimeoutSeconds { get; set; }` + +Cancel query after N seconds (0 = no timeout). Default: 300. + +#### ShowFetchXmlInExplain + +`bool ShowFetchXmlInExplain { get; set; }` + +Include FetchXML in EXPLAIN output. Default: true. + +#### UseBulkDelete + +`bool UseBulkDelete { get; set; }` + +Route full-table DELETE to async BulkDeleteRequest. Default: false. + +#### UseTdsEndpoint + +`bool UseTdsEndpoint { get; set; }` + +Route SELECT queries to TDS read replica. Default: false. + +#### WarnDeleteThreshold + +`Nullable WarnDeleteThreshold { get; set; }` + +Prompt when deleting more than N records (0 = always prompt). Default: 0. + +#### WarnInsertThreshold + +`Nullable WarnInsertThreshold { get; set; }` + +Prompt when inserting more than N records (0 = always prompt). Default: 1. + +#### WarnUpdateThreshold + +`Nullable WarnUpdateThreshold { get; set; }` + +Prompt when updating more than N records (0 = always prompt). Default: 0. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/TokenCacheDetector.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/TokenCacheDetector.md new file mode 100644 index 0000000..f8d3090 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/TokenCacheDetector.md @@ -0,0 +1,22 @@ + + +# TokenCacheDetector + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Class + +## Summary + +Utility to detect the token cache type for the current platform. + +## Members + +### Methods + +#### GetCacheType + +`TokenCacheType GetCacheType()` + +Gets the token cache type for the current platform. + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/TokenCacheType.md b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/TokenCacheType.md new file mode 100644 index 0000000..4e0d941 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/Profiles/TokenCacheType.md @@ -0,0 +1,35 @@ + + +# TokenCacheType + +- Namespace: `PPDS.Auth.Profiles` +- Assembly: `PPDS.Auth` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Token cache storage type. + +## Members + +### Fields + +#### File + +`TokenCacheType File` + +Token cache stored in a file (fallback for systems without secure storage). + +#### Memory + +`TokenCacheType Memory` + +Token cache stored in memory only (not persisted). + +#### OperatingSystem + +`TokenCacheType OperatingSystem` + +Token cache stored in OS credential store (Windows DPAPI, macOS Keychain, Linux libsecret). + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/ServiceClientFactory.md b/docs/reference/libraries/docs/reference/libraries/Auth/ServiceClientFactory.md new file mode 100644 index 0000000..d06669d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/ServiceClientFactory.md @@ -0,0 +1,76 @@ + + +# ServiceClientFactory + +- Namespace: `PPDS.Auth` +- Assembly: `PPDS.Auth` +- Kind: Class +- Implements: `IDisposable` + +## Summary + +Factory for creating authenticated ServiceClient instances from profiles. + +## Members + +### Constructors + +#### ServiceClientFactory(ProfileStore profileStore, Action deviceCodeCallback) + +`ServiceClientFactory(ProfileStore profileStore, Action deviceCodeCallback)` + +Creates a new ServiceClientFactory. + +- Param `profileStore`: The profile store to use. + +- Param `deviceCodeCallback`: Optional callback for device code display. + + +### Methods + +#### CreateFromActiveProfileAsync + +`Task CreateFromActiveProfileAsync(string environmentUrl, CancellationToken cancellationToken)` + +Creates an authenticated ServiceClient for the active profile. + +- Param `environmentUrl`: Optional environment URL override. If not specified, uses the profile's environment. + +- Param `cancellationToken`: Cancellation token. + +- Returns: An authenticated ServiceClient. + +#### CreateFromProfileNameAsync + +`Task CreateFromProfileNameAsync(string profileName, string environmentUrl, CancellationToken cancellationToken)` + +Creates an authenticated ServiceClient for a specific profile by name. + +- Param `profileName`: The profile name. + +- Param `environmentUrl`: Optional environment URL override. + +- Param `cancellationToken`: Cancellation token. + +- Returns: An authenticated ServiceClient. + +#### CreateFromProfileNamesAsync + +`Task> CreateFromProfileNamesAsync(IEnumerable profileNames, string environmentUrl, CancellationToken cancellationToken)` + +Creates authenticated ServiceClients for multiple profiles (for pooling). + +- Param `profileNames`: The profile names. + +- Param `environmentUrl`: Environment URL (required if any profile has no environment). + +- Param `cancellationToken`: Cancellation token. + +- Returns: List of authenticated ServiceClients. + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + diff --git a/docs/reference/libraries/docs/reference/libraries/Auth/_index.md b/docs/reference/libraries/docs/reference/libraries/Auth/_index.md new file mode 100644 index 0000000..ddee43c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Auth/_index.md @@ -0,0 +1,84 @@ + + +# Auth reference + +## Interfaces + +| Type | Summary | +|------|---------| +| [ICredentialProvider](./Credentials/ICredentialProvider.md) | Provides authenticated ServiceClient instances for a specific auth method. | +| [IGlobalDiscoveryService](./Discovery/IGlobalDiscoveryService.md) | Service for discovering Dataverse environments via the Global Discovery Service. | +| [IPowerPlatformTokenProvider](./Credentials/IPowerPlatformTokenProvider.md) | Provides access tokens for Power Platform REST APIs (Power Apps, Power Automate, etc.). | +| [ISecureCredentialStore](./Credentials/ISecureCredentialStore.md) | Provides secure, platform-native credential storage for service principal secrets. | + +## Classes + +| Type | Summary | +|------|---------| +| [AmbiguousMatchException](./Discovery/AmbiguousMatchException.md) | Exception thrown when multiple environments match a given identifier. | +| [AuthDebugLog](./AuthDebugLog.md) | Controls debug logging output for the auth library. | +| [AuthProfile](./Profiles/AuthProfile.md) | An authentication profile containing credentials and environment binding. | +| [AuthenticationException](./Credentials/AuthenticationException.md) | Exception thrown when authentication fails. | +| [AuthenticationOutput](./AuthenticationOutput.md) | Controls authentication status output for the auth library. | +| [AzureDevOpsFederatedCredentialProvider](./Credentials/AzureDevOpsFederatedCredentialProvider.md) | Provides authentication using Azure DevOps OIDC (workload identity federation). | +| [CertificateFileCredentialProvider](./Credentials/CertificateFileCredentialProvider.md) | Provides authentication using a certificate file (PFX/P12). | +| [CertificateStoreCredentialProvider](./Credentials/CertificateStoreCredentialProvider.md) | Provides authentication using a certificate from the Windows certificate store. | +| [ClientSecretCredentialProvider](./Credentials/ClientSecretCredentialProvider.md) | Provides authentication using client ID and client secret (Service Principal). | +| [CloudEndpoints](./Cloud/CloudEndpoints.md) | Provides endpoint URLs for different Azure cloud environments. | +| [ConnectionResolver](./Pooling/ConnectionResolver.md) | Resolves profile names to authenticated connections. | +| [CredentialProviderFactory](./Credentials/CredentialProviderFactory.md) | Factory for creating credential providers from auth profiles. | +| [CredentialResult](./Credentials/CredentialResult.md) | Result of creating a credential provider. | +| [DeviceCodeCredentialProvider](./Credentials/DeviceCodeCredentialProvider.md) | Provides authentication using device code flow. | +| [DeviceCodeInfo](./Credentials/DeviceCodeInfo.md) | Information about a device code for authentication. | +| [DiscoveredEnvironment](./Discovery/DiscoveredEnvironment.md) | Represents an environment discovered via the Global Discovery Service. | +| [EnvironmentConfig](./Profiles/EnvironmentConfig.md) | User configuration for a specific Dataverse environment. | +| [EnvironmentConfigCollection](./Profiles/EnvironmentConfigCollection.md) | Root object for environments.json — holds per-environment configs and custom type defaults. | +| [EnvironmentConfigStore](./Profiles/EnvironmentConfigStore.md) | Manages persistent storage of environment configurations. | +| [EnvironmentInfo](./Profiles/EnvironmentInfo.md) | Information about a Dataverse environment bound to a profile. | +| [EnvironmentResolutionResult](./Discovery/EnvironmentResolutionResult.md) | Result of an environment resolution attempt. | +| [EnvironmentResolutionService](./Discovery/EnvironmentResolutionService.md) | Service for resolving environments using a multi-layer strategy. | +| [EnvironmentResolver](./Discovery/EnvironmentResolver.md) | Resolves an environment from a collection by various criteria. | +| [EnvironmentVariableAuth](./EnvironmentVariableAuth.md) | Reads authentication configuration from environment variables for CI/CD scenarios. | +| [GitHubFederatedCredentialProvider](./Credentials/GitHubFederatedCredentialProvider.md) | Provides authentication using GitHub Actions OIDC (workload identity federation). | +| [GlobalDiscoveryService](./Discovery/GlobalDiscoveryService.md) | Service for discovering Dataverse environments via the Global Discovery Service. | +| [InteractiveBrowserCredentialProvider](./Credentials/InteractiveBrowserCredentialProvider.md) | Provides authentication using interactive browser flow. | +| [ManagedIdentityCredentialProvider](./Credentials/ManagedIdentityCredentialProvider.md) | Provides authentication using Azure Managed Identity. | +| [NativeCredentialStore](./Credentials/NativeCredentialStore.md) | Provides secure, platform-native credential storage using OS credential managers. | +| [PowerPlatformToken](./Credentials/PowerPlatformToken.md) | Represents an access token for Power Platform APIs. | +| [PowerPlatformTokenProvider](./Credentials/PowerPlatformTokenProvider.md) | Provides access tokens for Power Platform REST APIs using MSAL. | +| [ProfileCollection](./Profiles/ProfileCollection.md) | Collection of authentication profiles with active profile tracking. | +| [ProfileConnectionSource](./Pooling/ProfileConnectionSource.md) | Connection source that creates ServiceClients from an authentication profile. | +| [ProfileEncryption](./Profiles/ProfileEncryption.md) | Provides platform-specific encryption for sensitive profile data. | +| [ProfilePaths](./Profiles/ProfilePaths.md) | Provides platform-specific paths for profile storage. | +| [ProfileResolver](./Profiles/ProfileResolver.md) | Resolves which profile to use based on the priority order: | +| [ProfileStore](./Profiles/ProfileStore.md) | Manages persistent storage of authentication profiles. | +| [QuerySafetySettings](./Profiles/QuerySafetySettings.md) | Per-environment query safety settings. Stored in environment config JSON. | +| [ServiceClientFactory](./ServiceClientFactory.md) | Factory for creating authenticated ServiceClient instances from profiles. | +| [ServiceCollectionExtensions](./DependencyInjection/ServiceCollectionExtensions.md) | Extension methods for registering PPDS Auth services with dependency injection. | +| [StoredCredential](./Credentials/StoredCredential.md) | Represents a credential stored in secure platform storage. | +| [TokenCacheDetector](./Profiles/TokenCacheDetector.md) | Utility to detect the token cache type for the current platform. | +| [TokenCacheManager](./Credentials/TokenCacheManager.md) | Manages token cache operations including clearing cached credentials. | +| [UsernamePasswordCredentialProvider](./Credentials/UsernamePasswordCredentialProvider.md) | Provides authentication using username and password (ROPC flow). | + +## Records + +| Type | Summary | +|------|---------| +| [CachedTokenInfo](./Credentials/CachedTokenInfo.md) | Information about a cached token, retrieved without triggering authentication. | + +## Enums + +| Type | Summary | +|------|---------| +| [AuthMethod](./Profiles/AuthMethod.md) | Authentication method for a profile. | +| [BypassPluginMode](./Profiles/BypassPluginMode.md) | Which plugin types to bypass during DML operations. | +| [CloudEnvironment](./Cloud/CloudEnvironment.md) | Azure cloud environments for Dataverse authentication. | +| [CrossEnvironmentDmlPolicy](./Profiles/CrossEnvironmentDmlPolicy.md) | Cross-environment DML policy. | +| [DateTimeMode](./Profiles/DateTimeMode.md) | DateTime display mode for query results. | +| [EnvironmentColor](./Profiles/EnvironmentColor.md) | Named colors for environment theming. | +| [EnvironmentType](./Profiles/EnvironmentType.md) | Classification of Dataverse environment types. | +| [PreAuthDialogResult](./Credentials/PreAuthDialogResult.md) | Result of the pre-authentication dialog shown before browser auth. | +| [ProtectionLevel](./Profiles/ProtectionLevel.md) | Environment protection level determining DML behavior. | +| [ResolutionMethod](./Discovery/ResolutionMethod.md) | Method used to resolve an environment. | +| [TokenCacheType](./Profiles/TokenCacheType.md) | Token cache storage type. | + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/AdaptiveBatchSizer.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/AdaptiveBatchSizer.md new file mode 100644 index 0000000..78d5851 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/AdaptiveBatchSizer.md @@ -0,0 +1,54 @@ + + +# AdaptiveBatchSizer + +- Namespace: `PPDS.Dataverse.BulkOperations` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Dynamically adjusts DML batch size based on observed execution times. +Targets a configurable time per batch (default 10 seconds) to balance +throughput and timeout prevention. + +## Members + +### Constructors + +#### AdaptiveBatchSizer(int initialSize, double targetSeconds, int minSize, int maxSize) + +`AdaptiveBatchSizer(int initialSize, double targetSeconds, int minSize, int maxSize)` + +Initializes a new instance of the `PPDS.Dataverse.BulkOperations.AdaptiveBatchSizer` class. + +- Param `initialSize`: The starting batch size. Default: 100. + +- Param `targetSeconds`: The target execution time per batch in seconds. Default: 10.0. + +- Param `minSize`: The minimum allowed batch size. Default: 1. + +- Param `maxSize`: The maximum allowed batch size. Default: 1000. + + +### Methods + +#### RecordBatchResult + +`void RecordBatchResult(int batchSize, TimeSpan elapsed)` + +Records the result of a batch execution and adjusts the batch size. + +- Param `batchSize`: The number of records in the completed batch. + +- Param `elapsed`: The wall-clock time the batch took to execute. + + +### Properties + +#### CurrentBatchSize + +`int CurrentBatchSize { get; set; }` + +Gets the current recommended batch size. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/AdaptiveThrottleManager.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/AdaptiveThrottleManager.md new file mode 100644 index 0000000..0c687ec --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/AdaptiveThrottleManager.md @@ -0,0 +1,111 @@ + + +# AdaptiveThrottleManager + +- Namespace: `PPDS.Dataverse.BulkOperations` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Dynamically adjusts the degree of parallelism (DOP) for bulk DML operations +in response to Dataverse 429 (service protection limit) errors. +Complementary to `PPDS.Dataverse.BulkOperations.AdaptiveBatchSizer` which adjusts batch SIZE; +this class adjusts thread COUNT. + +## Members + +### Constructors + +#### AdaptiveThrottleManager(int maxDop, int initialDop, int successThreshold, Nullable cooldownPeriod, Func clock) + +`AdaptiveThrottleManager(int maxDop, int initialDop, int successThreshold, Nullable cooldownPeriod, Func clock)` + +Initializes a new instance of the `PPDS.Dataverse.BulkOperations.AdaptiveThrottleManager` class. + +- Param `maxDop`: Maximum degree of parallelism (upper bound). Must be at least 1. + +- Param `initialDop`: Initial active DOP. If zero or negative, defaults to `maxDop`. +Clamped to [1, `maxDop`]. + +- Param `successThreshold`: Number of consecutive successes required before DOP can increase. Default: 5. + +- Param `cooldownPeriod`: Minimum time after a throttle before DOP can increase. Default: 30 seconds. +If null, uses `PPDS.Dataverse.BulkOperations.AdaptiveThrottleManager.DefaultCooldownPeriod`. + +- Param `clock`: Optional clock function for testability. Returns UTC now. +If null, uses `System.DateTime.UtcNow`. + + +### Methods + +#### RecordSuccess + +`void RecordSuccess()` + +Records a successful batch execution. After `PPDS.Dataverse.BulkOperations.AdaptiveThrottleManager.SuccessThreshold` +consecutive successes AND `PPDS.Dataverse.BulkOperations.AdaptiveThrottleManager.CooldownPeriod` since the last throttle, +increments the active DOP by one (up to `PPDS.Dataverse.BulkOperations.AdaptiveThrottleManager.MaxDop`). + +#### RecordThrottle + +`void RecordThrottle()` + +Records a throttle (429) event. Halves the active DOP (minimum 1), +resets the consecutive success counter, and records the throttle timestamp. + + +### Properties + +#### ActiveDop + +`int ActiveDop { get; }` + +Gets the current active degree of parallelism. + +#### ConsecutiveSuccesses + +`int ConsecutiveSuccesses { get; }` + +Gets the number of consecutive successes since the last throttle or DOP increase. + +#### CooldownPeriod + +`TimeSpan CooldownPeriod { get; }` + +Gets the cooldown period after a throttle before DOP can increase. + +#### LastThrottleTime + +`DateTime LastThrottleTime { get; }` + +Gets the timestamp of the last throttle event, or `System.DateTime.MinValue` +if no throttle has occurred. + +#### MaxDop + +`int MaxDop { get; }` + +Gets the maximum degree of parallelism (upper bound for recovery). + +#### SuccessThreshold + +`int SuccessThreshold { get; }` + +Gets the number of consecutive successes required before DOP can increase. + + +### Fields + +#### DefaultCooldownPeriod + +`TimeSpan DefaultCooldownPeriod` + +Default cooldown period after a throttle before DOP can increase. + +#### DefaultSuccessThreshold + +`int DefaultSuccessThreshold` + +Default number of consecutive successes required before increasing DOP. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BatchCoordinatorExhaustedException.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BatchCoordinatorExhaustedException.md new file mode 100644 index 0000000..2124f9a --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BatchCoordinatorExhaustedException.md @@ -0,0 +1,45 @@ + + +# BatchCoordinatorExhaustedException + +- Namespace: `PPDS.Dataverse.BulkOperations` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Exception` +- Implements: `ISerializable` + +## Summary + +Thrown when batch coordinator cannot acquire a slot within timeout. + +## Members + +### Constructors + +#### BatchCoordinatorExhaustedException(int availableSlots, int totalCapacity, TimeSpan timeout) + +`BatchCoordinatorExhaustedException(int availableSlots, int totalCapacity, TimeSpan timeout)` + +Creates a new exception with details about the exhaustion. + + +### Properties + +#### AvailableSlots + +`int AvailableSlots { get; }` + +Gets the number of slots that were available when timeout occurred. + +#### Timeout + +`TimeSpan Timeout { get; }` + +Gets the timeout duration that was exceeded. + +#### TotalCapacity + +`int TotalCapacity { get; }` + +Gets the total capacity of the coordinator. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BatchFailureDiagnostic.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BatchFailureDiagnostic.md new file mode 100644 index 0000000..34d9b63 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BatchFailureDiagnostic.md @@ -0,0 +1,58 @@ + + +# BatchFailureDiagnostic + +- Namespace: `PPDS.Dataverse.BulkOperations` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Diagnostic information for identifying the cause of a batch failure. + +## Members + +### Properties + +#### FieldName + +`string FieldName { get; set; }` + +Gets the attribute/field name that contains the problematic reference. + +#### Pattern + +`string Pattern { get; set; }` + +Gets the detected error pattern. + +#### RecordId + +`Guid RecordId { get; set; }` + +Gets the record ID that contains the problematic reference. + +#### RecordIndex + +`int RecordIndex { get; set; }` + +Gets the index of this record within the failed batch. + +#### ReferencedEntityName + +`string ReferencedEntityName { get; set; }` + +Gets the logical name of the referenced entity. + +#### ReferencedId + +`Guid ReferencedId { get; set; }` + +Gets the ID of the missing or problematic reference. + +#### Suggestion + +`string Suggestion { get; set; }` + +Gets a suggestion for resolving the issue. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BatchParallelismCoordinator.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BatchParallelismCoordinator.md new file mode 100644 index 0000000..2a5ef7c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BatchParallelismCoordinator.md @@ -0,0 +1,63 @@ + + +# BatchParallelismCoordinator + +- Namespace: `PPDS.Dataverse.BulkOperations` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IDisposable` + +## Summary + +Coordinates batch parallelism across all concurrent bulk operations. +Ensures total concurrent batches never exceed pool's recommended DOP. + +## Members + +### Constructors + +#### BatchParallelismCoordinator(IDataverseConnectionPool pool, Nullable acquireTimeout) + +`BatchParallelismCoordinator(IDataverseConnectionPool pool, Nullable acquireTimeout)` + +Creates a new coordinator tied to the specified connection pool. + +- Param `pool`: The connection pool to coordinate with. + +- Param `acquireTimeout`: Maximum time to wait for a batch slot. Defaults to 120 seconds (matching pool timeout). + + +### Methods + +#### AcquireAsync + +`Task AcquireAsync(CancellationToken cancellationToken)` + +Acquires a batch execution slot. Blocks until slot available or timeout. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Disposable slot that must be disposed after batch completes. + +#### Dispose + +`void Dispose()` + +Disposes the coordinator and releases all resources. + + +### Properties + +#### AvailableSlots + +`int AvailableSlots { get; }` + +Gets the number of currently available batch slots. + +#### CurrentCapacity + +`int CurrentCapacity { get; }` + +Gets the current batch slot capacity. +May expand during throttle recovery as pool DOP increases. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationError.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationError.md new file mode 100644 index 0000000..29527a5 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationError.md @@ -0,0 +1,61 @@ + + +# BulkOperationError + +- Namespace: `PPDS.Dataverse.BulkOperations` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Error details for a failed record in a bulk operation. + +## Members + +### Properties + +#### Diagnostics + +`IReadOnlyList Diagnostics { get; set; }` + +Gets diagnostics identifying which record(s) caused the batch failure. + +#### ErrorCode + +`int ErrorCode { get; set; }` + +Gets the error code. + +#### FieldName + +`string FieldName { get; set; }` + +Gets the field name that caused the error, if identifiable from the error message. +Useful for debugging lookup failures and required field errors. + +#### FieldValueDescription + +`string FieldValueDescription { get; set; }` + +Gets a description of the field value that caused the error (sanitized for logging). +For EntityReference: "{LogicalName}:{Id}". For other types: type name only. +Does not contain actual data values to avoid PII in logs. + +#### Index + +`int Index { get; set; }` + +Gets the index of the record in the input collection. + +#### Message + +`string Message { get; set; }` + +Gets the error message. + +#### RecordId + +`Nullable RecordId { get; set; }` + +Gets the record ID, if available. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationErrorCode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationErrorCode.md new file mode 100644 index 0000000..c23ccef --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationErrorCode.md @@ -0,0 +1,22 @@ + + +# BulkOperationErrorCode + +- Namespace: `PPDS.Dataverse.BulkOperations` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Structured error codes for bulk operation validation failures. + +## Members + +### Fields + +#### InvalidBatchSize + +`string InvalidBatchSize` + +BatchSize is out of the allowed range (1 to 1000). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationExecutor.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationExecutor.md new file mode 100644 index 0000000..0a15bca --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationExecutor.md @@ -0,0 +1,148 @@ + + +# BulkOperationExecutor + +- Namespace: `PPDS.Dataverse.BulkOperations` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IBulkOperationExecutor` + +## Summary + +Executes bulk operations using modern Dataverse APIs. +Uses CreateMultipleRequest, UpdateMultipleRequest, UpsertMultipleRequest for optimal performance. + +## Members + +### Constructors + +#### BulkOperationExecutor(IDataverseConnectionPool connectionPool, IThrottleTracker throttleTracker, IOptions options, ILogger logger) + +`BulkOperationExecutor(IDataverseConnectionPool connectionPool, IThrottleTracker throttleTracker, IOptions options, ILogger logger)` + +Initializes a new instance of the `PPDS.Dataverse.BulkOperations.BulkOperationExecutor` class. + +- Param `connectionPool`: The connection pool. + +- Param `throttleTracker`: The throttle tracker for pre-flight throttle checks. + +- Param `options`: Configuration options. + +- Param `logger`: Logger instance. + + +### Methods + +#### AnalyzeBatchFailure + +`IReadOnlyList AnalyzeBatchFailure(IReadOnlyList batch, Exception exception)` + +Analyzes a batch failure to identify which record(s) caused the failure. + +- Param `batch`: The batch of entities that failed. + +- Param `exception`: The exception that was thrown. + +- Returns: A list of diagnostics identifying problematic records. + +#### CreateMultipleAsync + +`Task CreateMultipleAsync(string entityLogicalName, IEnumerable entities, BulkOperationOptions options, DataverseClientOptions clientOptions, IProgress progress, CancellationToken cancellationToken)` + +Creates multiple records using the CreateMultiple API. + +- Param `entityLogicalName`: The entity logical name. + +- Param `entities`: The entities to create. + +- Param `options`: Bulk operation options. + +- Param `clientOptions`: Optional per-request connection options (e.g., CallerId for impersonation). + +- Param `progress`: Optional progress reporter for tracking operation progress. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The result of the operation. + +#### DeleteMultipleAsync + +`Task DeleteMultipleAsync(string entityLogicalName, IEnumerable ids, BulkOperationOptions options, DataverseClientOptions clientOptions, IProgress progress, CancellationToken cancellationToken)` + +Deletes multiple records using the DeleteMultiple API. + +- Param `entityLogicalName`: The entity logical name. + +- Param `ids`: The IDs of the records to delete. + +- Param `options`: Bulk operation options. + +- Param `clientOptions`: Optional per-request connection options (e.g., CallerId for impersonation). + +- Param `progress`: Optional progress reporter for tracking operation progress. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The result of the operation. + +#### UpdateMultipleAsync + +`Task UpdateMultipleAsync(string entityLogicalName, IEnumerable entities, BulkOperationOptions options, DataverseClientOptions clientOptions, IProgress progress, CancellationToken cancellationToken)` + +Updates multiple records using the UpdateMultiple API. + +- Param `entityLogicalName`: The entity logical name. + +- Param `entities`: The entities to update. + +- Param `options`: Bulk operation options. + +- Param `clientOptions`: Optional per-request connection options (e.g., CallerId for impersonation). + +- Param `progress`: Optional progress reporter for tracking operation progress. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The result of the operation. + +#### UpsertMultipleAsync + +`Task UpsertMultipleAsync(string entityLogicalName, IEnumerable entities, BulkOperationOptions options, DataverseClientOptions clientOptions, IProgress progress, CancellationToken cancellationToken)` + +Upserts multiple records using the UpsertMultiple API. + +- Param `entityLogicalName`: The entity logical name. + +- Param `entities`: The entities to upsert. + +- Param `options`: Bulk operation options. + +- Param `clientOptions`: Optional per-request connection options (e.g., CallerId for impersonation). + +- Param `progress`: Optional progress reporter for tracking operation progress. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The result of the operation. + + +### Properties + +#### AdaptiveSizer + +`AdaptiveBatchSizer AdaptiveSizer { get; set; }` + +Gets or sets an optional adaptive batch sizer that dynamically adjusts batch sizes +based on observed execution times. When null, the fixed `PPDS.Dataverse.BulkOperations.BulkOperationOptions.BatchSize` +is used for all batches. + +#### ThrottleManager + +`AdaptiveThrottleManager ThrottleManager { get; set; }` + +Gets or sets an optional adaptive throttle manager that dynamically adjusts the +degree of parallelism based on 429 (service protection limit) responses. +When null, throttle events are handled by the existing retry logic without +adjusting parallelism. Complementary to `PPDS.Dataverse.BulkOperations.BulkOperationExecutor.AdaptiveSizer`: that adjusts +batch SIZE, this adjusts thread COUNT. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationOptions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationOptions.md new file mode 100644 index 0000000..91967b8 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationOptions.md @@ -0,0 +1,105 @@ + + +# BulkOperationOptions + +- Namespace: `PPDS.Dataverse.BulkOperations` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Configuration options for bulk operations. + +## Members + +### Properties + +#### BatchSize + +`int BatchSize { get; set; }` + +Gets or sets the number of records per batch. +Must be between `PPDS.Dataverse.BulkOperations.BulkOperationOptions.MinBatchSize` and `PPDS.Dataverse.BulkOperations.BulkOperationOptions.MaxBatchSize` inclusive. +Benchmarks show 100 is optimal for both standard and elastic tables. +Default: 100 + +#### BypassCustomLogic + +`CustomLogicBypass BypassCustomLogic { get; set; }` + +Gets or sets which custom business logic to bypass during execution. + +#### BypassPowerAutomateFlows + +`bool BypassPowerAutomateFlows { get; set; }` + +Gets or sets a value indicating whether to bypass Power Automate flows. +When true, flows using "When a row is added, modified or deleted" triggers will not execute. +No special privilege is required. +Default: false + +#### ContinueOnError + +`bool ContinueOnError { get; set; }` + +Gets or sets a value indicating whether to continue after individual record failures. +Only applies to Delete operations on standard tables (ElasticTable = false). +Elastic tables always support partial success automatically. +Default: true + +#### ElasticTable + +`bool ElasticTable { get; set; }` + +Gets or sets a value indicating whether the target is an elastic table (Cosmos DB-backed). + +When false (default, for standard SQL-backed tables): +Create/Update/Upsert: Uses all-or-nothing batch semantics (any error fails entire batch)Delete: Uses ExecuteMultiple with individual DeleteRequests +When true (for elastic tables): +All operations support partial success with per-record error detailsDelete uses native DeleteMultiple APIConsider reducing BatchSize to 100 for optimal performance +Default: false + +#### MaxParallelBatches + +`Nullable MaxParallelBatches { get; set; }` + +Gets or sets the maximum number of batches to process in parallel. + +When null (default), uses the ServiceClient's RecommendedDegreesOfParallelism +which comes from the x-ms-dop-hint response header from Dataverse. + +Set to 1 for sequential processing, or a specific value to override +Microsoft's recommendation. + +Default: null (use RecommendedDegreesOfParallelism) + +#### SuppressDuplicateDetection + +`bool SuppressDuplicateDetection { get; set; }` + +Gets or sets a value indicating whether to suppress duplicate detection. +Default: false + +#### Tag + +`string Tag { get; set; }` + +Gets or sets a tag value passed to plugin execution context. + + +### Fields + +#### MaxBatchSize + +`int MaxBatchSize` + +Maximum allowed batch size (inclusive). Dataverse rejects values greater than 1000 +with an opaque error that can make the whole batch fail silently, so we validate +up-front. + +#### MinBatchSize + +`int MinBatchSize` + +Minimum allowed batch size (inclusive). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationResult.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationResult.md new file mode 100644 index 0000000..3939df9 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationResult.md @@ -0,0 +1,74 @@ + + +# BulkOperationResult + +- Namespace: `PPDS.Dataverse.BulkOperations` +- Assembly: `PPDS.Dataverse` +- Kind: Record +- Implements: `IEquatable` + +## Summary + +Result of a bulk operation. + +## Members + +### Properties + +#### CreatedCount + +`Nullable CreatedCount { get; set; }` + +Gets the number of records that were created during an UpsertMultiple operation. +Only populated for upsert operations; null for create/update/delete. + +#### CreatedIds + +`IReadOnlyList CreatedIds { get; set; }` + +Gets the IDs of successfully created records from CreateMultiple operations. +Only populated for create operations; null for update/upsert/delete. + +#### Duration + +`TimeSpan Duration { get; set; }` + +Gets the duration of the operation. + +#### Errors + +`IReadOnlyList Errors { get; set; }` + +Gets the errors that occurred during the operation. + +#### FailureCount + +`int FailureCount { get; set; }` + +Gets the number of failed operations. + +#### IsSuccess + +`bool IsSuccess { get; }` + +Gets a value indicating whether all operations succeeded. + +#### SuccessCount + +`int SuccessCount { get; set; }` + +Gets the number of successful operations. + +#### TotalCount + +`int TotalCount { get; }` + +Gets the total number of operations attempted. + +#### UpdatedCount + +`Nullable UpdatedCount { get; set; }` + +Gets the number of records that were updated during an UpsertMultiple operation. +Only populated for upsert operations; null for create/update/delete. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationValidationException.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationValidationException.md new file mode 100644 index 0000000..f1b8680 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/BulkOperationValidationException.md @@ -0,0 +1,40 @@ + + +# BulkOperationValidationException + +- Namespace: `PPDS.Dataverse.BulkOperations` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `ArgumentException` +- Implements: `ISerializable` + +## Summary + +Exception thrown when bulk operation configuration fails validation. + +## Members + +### Constructors + +#### BulkOperationValidationException(string errorCode, string message, string paramName) + +`BulkOperationValidationException(string errorCode, string message, string paramName)` + +Creates a new bulk operation validation exception. + +- Param `errorCode`: The structured error code (use `PPDS.Dataverse.BulkOperations.BulkOperationErrorCode` constants). + +- Param `message`: Human-readable error message. + +- Param `paramName`: Optional parameter name that failed validation. + + +### Properties + +#### ErrorCode + +`string ErrorCode { get; }` + +Structured error code for programmatic handling. +Uses the `BulkOperation.*` prefix (see `PPDS.Dataverse.BulkOperations.BulkOperationErrorCode`). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/CustomLogicBypass.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/CustomLogicBypass.md new file mode 100644 index 0000000..3cf7811 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/CustomLogicBypass.md @@ -0,0 +1,46 @@ + + +# CustomLogicBypass + +- Namespace: `PPDS.Dataverse.BulkOperations` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Specifies which custom business logic to bypass during bulk operations. + +## Members + +### Fields + +#### All + +`CustomLogicBypass All` + +Bypass all custom plugins and workflows (both sync and async). +Does not affect Power Automate flows. +Maps to Dataverse parameter: `BypassBusinessLogicExecution: "CustomSync,CustomAsync"` + +#### Asynchronous + +`CustomLogicBypass Asynchronous` + +Bypass asynchronous custom plugins and workflows. +Does not affect Power Automate flows. +Maps to Dataverse parameter: `BypassBusinessLogicExecution: "CustomAsync"` + +#### None + +`CustomLogicBypass None` + +No bypass - execute all custom business logic (default). + +#### Synchronous + +`CustomLogicBypass Synchronous` + +Bypass synchronous custom plugins and workflows. +Maps to Dataverse parameter: `BypassBusinessLogicExecution: "CustomSync"` + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/IBulkOperationExecutor.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/IBulkOperationExecutor.md new file mode 100644 index 0000000..f3c0d2c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/BulkOperations/IBulkOperationExecutor.md @@ -0,0 +1,97 @@ + + +# IBulkOperationExecutor + +- Namespace: `PPDS.Dataverse.BulkOperations` +- Assembly: `PPDS.Dataverse` +- Kind: Interface + +## Summary + +Executes bulk operations using modern Dataverse APIs. +Provides CreateMultiple, UpdateMultiple, UpsertMultiple, and DeleteMultiple wrappers. + +## Members + +### Methods + +#### CreateMultipleAsync + +`Task CreateMultipleAsync(string entityLogicalName, IEnumerable entities, BulkOperationOptions options, DataverseClientOptions clientOptions, IProgress progress, CancellationToken cancellationToken)` + +Creates multiple records using the CreateMultiple API. + +- Param `entityLogicalName`: The entity logical name. + +- Param `entities`: The entities to create. + +- Param `options`: Bulk operation options. + +- Param `clientOptions`: Optional per-request connection options (e.g., CallerId for impersonation). + +- Param `progress`: Optional progress reporter for tracking operation progress. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The result of the operation. + +#### DeleteMultipleAsync + +`Task DeleteMultipleAsync(string entityLogicalName, IEnumerable ids, BulkOperationOptions options, DataverseClientOptions clientOptions, IProgress progress, CancellationToken cancellationToken)` + +Deletes multiple records using the DeleteMultiple API. + +- Param `entityLogicalName`: The entity logical name. + +- Param `ids`: The IDs of the records to delete. + +- Param `options`: Bulk operation options. + +- Param `clientOptions`: Optional per-request connection options (e.g., CallerId for impersonation). + +- Param `progress`: Optional progress reporter for tracking operation progress. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The result of the operation. + +#### UpdateMultipleAsync + +`Task UpdateMultipleAsync(string entityLogicalName, IEnumerable entities, BulkOperationOptions options, DataverseClientOptions clientOptions, IProgress progress, CancellationToken cancellationToken)` + +Updates multiple records using the UpdateMultiple API. + +- Param `entityLogicalName`: The entity logical name. + +- Param `entities`: The entities to update. + +- Param `options`: Bulk operation options. + +- Param `clientOptions`: Optional per-request connection options (e.g., CallerId for impersonation). + +- Param `progress`: Optional progress reporter for tracking operation progress. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The result of the operation. + +#### UpsertMultipleAsync + +`Task UpsertMultipleAsync(string entityLogicalName, IEnumerable entities, BulkOperationOptions options, DataverseClientOptions clientOptions, IProgress progress, CancellationToken cancellationToken)` + +Upserts multiple records using the UpsertMultiple API. + +- Param `entityLogicalName`: The entity logical name. + +- Param `entities`: The entities to upsert. + +- Param `options`: Bulk operation options. + +- Param `clientOptions`: Optional per-request connection options (e.g., CallerId for impersonation). + +- Param `progress`: Optional progress reporter for tracking operation progress. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The result of the operation. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Client/DataverseClient.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Client/DataverseClient.md new file mode 100644 index 0000000..7f8e15d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Client/DataverseClient.md @@ -0,0 +1,279 @@ + + +# DataverseClient + +- Namespace: `PPDS.Dataverse.Client` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IOrganizationServiceAsync`, `IOrganizationServiceAsync2`, `IOrganizationService`, `IDataverseClient`, `IDisposable` + +## Summary + +Implementation of `PPDS.Dataverse.Client.IDataverseClient` that wraps a `Microsoft.PowerPlatform.Dataverse.Client.ServiceClient`. +Provides a consistent abstraction over the Dataverse SDK. + +## Members + +### Constructors + +#### DataverseClient(ServiceClient serviceClient) + +`DataverseClient(ServiceClient serviceClient)` + +Initializes a new instance of the `PPDS.Dataverse.Client.DataverseClient` class. + +- Param `serviceClient`: The underlying ServiceClient to wrap. + +#### DataverseClient(string connectionString) + +`DataverseClient(string connectionString)` + +Initializes a new instance of the `PPDS.Dataverse.Client.DataverseClient` class using a connection string. + +- Param `connectionString`: The Dataverse connection string. + + +### Methods + +#### Associate + +`void Associate(string entityName, Guid entityId, Relationship relationship, EntityReferenceCollection relatedEntities)` + +*(inherited from `Microsoft.Xrm.Sdk.IOrganizationService.Associate(System.String,System.Guid,Microsoft.Xrm.Sdk.Relationship,Microsoft.Xrm.Sdk.EntityReferenceCollection)`)* + +#### AssociateAsync + +`Task AssociateAsync(string entityName, Guid entityId, Relationship relationship, EntityReferenceCollection relatedEntities)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync.AssociateAsync(System.String,System.Guid,Microsoft.Xrm.Sdk.Relationship,Microsoft.Xrm.Sdk.EntityReferenceCollection)`)* + +#### AssociateAsync + +`Task AssociateAsync(string entityName, Guid entityId, Relationship relationship, EntityReferenceCollection relatedEntities, CancellationToken cancellationToken)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync2.AssociateAsync(System.String,System.Guid,Microsoft.Xrm.Sdk.Relationship,Microsoft.Xrm.Sdk.EntityReferenceCollection,System.Threading.CancellationToken)`)* + +#### Clone + +`IDataverseClient Clone()` + +Creates a clone of this client that shares the underlying connection. +Cloning is significantly faster than creating a new connection. + +- Returns: A cloned client instance. + +#### Create + +`Guid Create(Entity entity)` + +*(inherited from `Microsoft.Xrm.Sdk.IOrganizationService.Create(Microsoft.Xrm.Sdk.Entity)`)* + +#### CreateAndReturnAsync + +`Task CreateAndReturnAsync(Entity entity, CancellationToken cancellationToken)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync2.CreateAndReturnAsync(Microsoft.Xrm.Sdk.Entity,System.Threading.CancellationToken)`)* + +#### CreateAsync + +`Task CreateAsync(Entity entity)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync.CreateAsync(Microsoft.Xrm.Sdk.Entity)`)* + +#### CreateAsync + +`Task CreateAsync(Entity entity, CancellationToken cancellationToken)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync2.CreateAsync(Microsoft.Xrm.Sdk.Entity,System.Threading.CancellationToken)`)* + +#### Delete + +`void Delete(string entityName, Guid id)` + +*(inherited from `Microsoft.Xrm.Sdk.IOrganizationService.Delete(System.String,System.Guid)`)* + +#### DeleteAsync + +`Task DeleteAsync(string entityName, Guid id)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync.DeleteAsync(System.String,System.Guid)`)* + +#### DeleteAsync + +`Task DeleteAsync(string entityName, Guid id, CancellationToken cancellationToken)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync2.DeleteAsync(System.String,System.Guid,System.Threading.CancellationToken)`)* + +#### Disassociate + +`void Disassociate(string entityName, Guid entityId, Relationship relationship, EntityReferenceCollection relatedEntities)` + +*(inherited from `Microsoft.Xrm.Sdk.IOrganizationService.Disassociate(System.String,System.Guid,Microsoft.Xrm.Sdk.Relationship,Microsoft.Xrm.Sdk.EntityReferenceCollection)`)* + +#### DisassociateAsync + +`Task DisassociateAsync(string entityName, Guid entityId, Relationship relationship, EntityReferenceCollection relatedEntities)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync.DisassociateAsync(System.String,System.Guid,Microsoft.Xrm.Sdk.Relationship,Microsoft.Xrm.Sdk.EntityReferenceCollection)`)* + +#### DisassociateAsync + +`Task DisassociateAsync(string entityName, Guid entityId, Relationship relationship, EntityReferenceCollection relatedEntities, CancellationToken cancellationToken)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync2.DisassociateAsync(System.String,System.Guid,Microsoft.Xrm.Sdk.Relationship,Microsoft.Xrm.Sdk.EntityReferenceCollection,System.Threading.CancellationToken)`)* + +#### Dispose + +`void Dispose()` + +Disposes of the client and releases resources. + +#### Execute + +`OrganizationResponse Execute(OrganizationRequest request)` + +*(inherited from `Microsoft.Xrm.Sdk.IOrganizationService.Execute(Microsoft.Xrm.Sdk.OrganizationRequest)`)* + +#### ExecuteAsync + +`Task ExecuteAsync(OrganizationRequest request)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync.ExecuteAsync(Microsoft.Xrm.Sdk.OrganizationRequest)`)* + +#### ExecuteAsync + +`Task ExecuteAsync(OrganizationRequest request, CancellationToken cancellationToken)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync2.ExecuteAsync(Microsoft.Xrm.Sdk.OrganizationRequest,System.Threading.CancellationToken)`)* + +#### Retrieve + +`Entity Retrieve(string entityName, Guid id, ColumnSet columnSet)` + +*(inherited from `Microsoft.Xrm.Sdk.IOrganizationService.Retrieve(System.String,System.Guid,Microsoft.Xrm.Sdk.Query.ColumnSet)`)* + +#### RetrieveAsync + +`Task RetrieveAsync(string entityName, Guid id, ColumnSet columnSet)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync.RetrieveAsync(System.String,System.Guid,Microsoft.Xrm.Sdk.Query.ColumnSet)`)* + +#### RetrieveAsync + +`Task RetrieveAsync(string entityName, Guid id, ColumnSet columnSet, CancellationToken cancellationToken)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync2.RetrieveAsync(System.String,System.Guid,Microsoft.Xrm.Sdk.Query.ColumnSet,System.Threading.CancellationToken)`)* + +#### RetrieveMultiple + +`EntityCollection RetrieveMultiple(QueryBase query)` + +*(inherited from `Microsoft.Xrm.Sdk.IOrganizationService.RetrieveMultiple(Microsoft.Xrm.Sdk.Query.QueryBase)`)* + +#### RetrieveMultipleAsync + +`Task RetrieveMultipleAsync(QueryBase query)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync.RetrieveMultipleAsync(Microsoft.Xrm.Sdk.Query.QueryBase)`)* + +#### RetrieveMultipleAsync + +`Task RetrieveMultipleAsync(QueryBase query, CancellationToken cancellationToken)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync2.RetrieveMultipleAsync(Microsoft.Xrm.Sdk.Query.QueryBase,System.Threading.CancellationToken)`)* + +#### Update + +`void Update(Entity entity)` + +*(inherited from `Microsoft.Xrm.Sdk.IOrganizationService.Update(Microsoft.Xrm.Sdk.Entity)`)* + +#### UpdateAsync + +`Task UpdateAsync(Entity entity)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync.UpdateAsync(Microsoft.Xrm.Sdk.Entity)`)* + +#### UpdateAsync + +`Task UpdateAsync(Entity entity, CancellationToken cancellationToken)` + +*(inherited from `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync2.UpdateAsync(Microsoft.Xrm.Sdk.Entity,System.Threading.CancellationToken)`)* + + +### Properties + +#### CallerAADObjectId + +`Nullable CallerAADObjectId { get; set; }` + +Gets or sets the caller AAD object ID for impersonation. + +#### CallerId + +`Guid CallerId { get; set; }` + +Gets or sets the caller ID for impersonation. + +#### ConnectedOrgFriendlyName + +`string ConnectedOrgFriendlyName { get; }` + +Gets the connected organization friendly name. + +#### ConnectedOrgId + +`Nullable ConnectedOrgId { get; }` + +Gets the connected organization ID. + +#### ConnectedOrgUniqueName + +`string ConnectedOrgUniqueName { get; }` + +Gets the connected organization unique name. + +#### ConnectedOrgVersion + +`Version ConnectedOrgVersion { get; }` + +Gets the connected organization version. + +#### IsReady + +`bool IsReady { get; }` + +Gets a value indicating whether the connection is ready for operations. + +#### LastError + +`string LastError { get; }` + +Gets the last error message from the service. +Returns null when no error has occurred or the client is in a healthy state. + +#### LastException + +`Exception LastException { get; }` + +Gets the last exception from the service. +Returns null when no exception has occurred or the client is in a healthy state. + +#### MaxRetryCount + +`int MaxRetryCount { get; set; }` + +Gets or sets the maximum number of retry attempts for transient failures. + +#### RecommendedDegreesOfParallelism + +`int RecommendedDegreesOfParallelism { get; }` + +Gets the server-recommended degree of parallelism for bulk operations. + +#### RetryPauseTime + +`TimeSpan RetryPauseTime { get; set; }` + +Gets or sets the pause time between retry attempts. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Client/DataverseClientOptions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Client/DataverseClientOptions.md new file mode 100644 index 0000000..649c6e6 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Client/DataverseClientOptions.md @@ -0,0 +1,62 @@ + + +# DataverseClientOptions + +- Namespace: `PPDS.Dataverse.Client` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Options for configuring a Dataverse client request. +Used to customize behavior when acquiring a client from the pool. + +## Members + +### Constructors + +#### DataverseClientOptions() + +`DataverseClientOptions()` + +Creates a new instance of `PPDS.Dataverse.Client.DataverseClientOptions` with default values. + +#### DataverseClientOptions(Guid callerId) + +`DataverseClientOptions(Guid callerId)` + +Creates a new instance of `PPDS.Dataverse.Client.DataverseClientOptions` for impersonation. + +- Param `callerId`: The caller ID for impersonation. + + +### Properties + +#### CallerAADObjectId + +`Nullable CallerAADObjectId { get; set; }` + +Gets or sets the caller AAD object ID for impersonation. +Alternative to CallerId for AAD-based impersonation. + +#### CallerId + +`Nullable CallerId { get; set; }` + +Gets or sets the caller ID for impersonation. +When set, operations will be performed on behalf of this user. + +#### MaxRetryCount + +`Nullable MaxRetryCount { get; set; }` + +Gets or sets the maximum number of retry attempts for transient failures. +When null, uses the default configured on the pool. + +#### RetryPauseTime + +`Nullable RetryPauseTime { get; set; }` + +Gets or sets the pause time between retry attempts. +When null, uses the default configured on the pool. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Client/IDataverseClient.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Client/IDataverseClient.md new file mode 100644 index 0000000..26a9211 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Client/IDataverseClient.md @@ -0,0 +1,104 @@ + + +# IDataverseClient + +- Namespace: `PPDS.Dataverse.Client` +- Assembly: `PPDS.Dataverse` +- Kind: Interface +- Implements: `IOrganizationServiceAsync`, `IOrganizationServiceAsync2`, `IOrganizationService` + +## Summary + +Abstraction over ServiceClient providing core Dataverse operations. +Extends `Microsoft.PowerPlatform.Dataverse.Client.IOrganizationServiceAsync2` with additional Dataverse-specific properties. + +## Members + +### Methods + +#### Clone + +`IDataverseClient Clone()` + +Creates a clone of this client that shares the underlying connection. +Cloning is significantly faster than creating a new connection. + +- Returns: A cloned client instance. + + +### Properties + +#### CallerAADObjectId + +`Nullable CallerAADObjectId { get; set; }` + +Gets or sets the caller AAD object ID for impersonation. + +#### CallerId + +`Guid CallerId { get; set; }` + +Gets or sets the caller ID for impersonation. + +#### ConnectedOrgFriendlyName + +`string ConnectedOrgFriendlyName { get; }` + +Gets the connected organization friendly name. + +#### ConnectedOrgId + +`Nullable ConnectedOrgId { get; }` + +Gets the connected organization ID. + +#### ConnectedOrgUniqueName + +`string ConnectedOrgUniqueName { get; }` + +Gets the connected organization unique name. + +#### ConnectedOrgVersion + +`Version ConnectedOrgVersion { get; }` + +Gets the connected organization version. + +#### IsReady + +`bool IsReady { get; }` + +Gets a value indicating whether the connection is ready for operations. + +#### LastError + +`string LastError { get; }` + +Gets the last error message from the service. +Returns null when no error has occurred or the client is in a healthy state. + +#### LastException + +`Exception LastException { get; }` + +Gets the last exception from the service. +Returns null when no exception has occurred or the client is in a healthy state. + +#### MaxRetryCount + +`int MaxRetryCount { get; set; }` + +Gets or sets the maximum number of retry attempts for transient failures. + +#### RecommendedDegreesOfParallelism + +`int RecommendedDegreesOfParallelism { get; }` + +Gets the server-recommended degree of parallelism for bulk operations. + +#### RetryPauseTime + +`TimeSpan RetryPauseTime { get; set; }` + +Gets or sets the pause time between retry attempts. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/ConfigurationException.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/ConfigurationException.md new file mode 100644 index 0000000..61b3d28 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/ConfigurationException.md @@ -0,0 +1,127 @@ + + +# ConfigurationException + +- Namespace: `PPDS.Dataverse.Configuration` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Exception` +- Implements: `ISerializable` + +## Summary + +Exception thrown when Dataverse configuration is invalid. +Provides detailed context including property name, connection name, environment name, +and resolution hints showing where the property can be configured. + +## Members + +### Constructors + +#### ConfigurationException(string connectionName, string propertyName, string message) + +`ConfigurationException(string connectionName, string propertyName, string message)` + +Initializes a new instance of the `PPDS.Dataverse.Configuration.ConfigurationException` class. + +#### ConfigurationException(string message) + +`ConfigurationException(string message)` + +Initializes a new instance of the `PPDS.Dataverse.Configuration.ConfigurationException` class. + +#### ConfigurationException(string message, Exception innerException) + +`ConfigurationException(string message, Exception innerException)` + +Initializes a new instance of the `PPDS.Dataverse.Configuration.ConfigurationException` class. + + +### Methods + +#### InvalidValue + +`ConfigurationException InvalidValue(string connectionName, string propertyName, string reason)` + +Creates an exception for an invalid property value. + +#### MissingRequired + +`ConfigurationException MissingRequired(string connectionName, string propertyName)` + +Creates an exception for a missing required property. + +#### MissingRequiredWithHints + +`ConfigurationException MissingRequiredWithHints(string propertyName, string connectionName, int connectionIndex, string environmentName, string sectionName)` + +Creates an exception for a missing required property with full context and resolution hints. + +- Param `propertyName`: The name of the missing property (e.g., "Url", "ClientId"). + +- Param `connectionName`: The connection name (e.g., "Primary", "Secondary"). + +- Param `connectionIndex`: The zero-based index of the connection in the configuration array. + +- Param `environmentName`: The environment name, or null for root-level configurations. + +- Param `sectionName`: The configuration section name (default: "Dataverse"). + +- Returns: A ConfigurationException with formatted message and resolution hints. + +#### NoConnectionsConfigured + +`ConfigurationException NoConnectionsConfigured(string environmentName, string sectionName)` + +Creates an exception for when no connections are configured. + +- Param `environmentName`: The environment name, or null for root-level configurations. + +- Param `sectionName`: The configuration section name (default: "Dataverse"). + +#### SecretResolutionFailed + +`ConfigurationException SecretResolutionFailed(string connectionName, string propertyName, string source, Exception innerException)` + +Creates an exception for a secret resolution failure. + + +### Properties + +#### ConnectionIndex + +`Nullable ConnectionIndex { get; }` + +Gets the index of the connection in the configuration array. + +#### ConnectionName + +`string ConnectionName { get; }` + +Gets the name of the connection that has invalid configuration. + +#### EnvironmentName + +`string EnvironmentName { get; }` + +Gets the name of the environment where the configuration error occurred. +Null for root-level (single-environment) configurations. + +#### Message + +`string Message { get; }` + +Gets the formatted message including resolution hints. + +#### PropertyName + +`string PropertyName { get; }` + +Gets the name of the property that is invalid. + +#### ResolutionHints + +`IReadOnlyList ResolutionHints { get; }` + +Gets the configuration paths where the property can be set, in order of precedence. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/ConnectionStringBuilder.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/ConnectionStringBuilder.md new file mode 100644 index 0000000..25d7167 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/ConnectionStringBuilder.md @@ -0,0 +1,28 @@ + + +# ConnectionStringBuilder + +- Namespace: `PPDS.Dataverse.Configuration` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Builds Dataverse connection strings from typed configuration. + +## Members + +### Methods + +#### Build + +`string Build(DataverseConnection connection, string resolvedSecret)` + +Builds a connection string from a DataverseConnection configuration. + +- Param `connection`: The connection configuration. + +- Param `resolvedSecret`: The resolved secret value (from SecretResolver). + +- Returns: A Dataverse connection string. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/DataverseAuthType.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/DataverseAuthType.md new file mode 100644 index 0000000..df1cfdd --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/DataverseAuthType.md @@ -0,0 +1,46 @@ + + +# DataverseAuthType + +- Namespace: `PPDS.Dataverse.Configuration` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Authentication type for Dataverse connections. + +## Members + +### Fields + +#### Certificate + +`DataverseAuthType Certificate` + +Client ID and certificate authentication (Service Principal). +More secure than ClientSecret for high-security environments. + +#### ClientSecret + +`DataverseAuthType ClientSecret` + +Client ID and client secret authentication (Service Principal). +Recommended for production server-to-server scenarios. + +#### ManagedIdentity + +`DataverseAuthType ManagedIdentity` + +Azure Managed Identity authentication. +For Azure-hosted workloads (VMs, App Service, AKS, etc.). +No credentials needed - identity is provided by Azure. + +#### OAuth + +`DataverseAuthType OAuth` + +OAuth interactive authentication. +For development and user-context scenarios. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/DataverseEnvironmentOptions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/DataverseEnvironmentOptions.md new file mode 100644 index 0000000..c7a5196 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/DataverseEnvironmentOptions.md @@ -0,0 +1,50 @@ + + +# DataverseEnvironmentOptions + +- Namespace: `PPDS.Dataverse.Configuration` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Configuration for a named Dataverse environment. +Used for multi-environment scenarios like source/target migrations. + +## Members + +### Properties + +#### Connections + +`List Connections { get; set; }` + +Gets or sets the connections for this environment. +Multiple connections enable load distribution across Application Users. + +#### HasConnections + +`bool HasConnections { get; }` + +Gets whether this environment has any connections configured. + +#### Name + +`string Name { get; set; }` + +Gets or sets the environment name. +Example: "dev", "qa", "prod", "source", "target" + +#### TenantId + +`string TenantId { get; set; }` + +Gets or sets the Azure AD tenant ID for this environment. + +#### Url + +`string Url { get; set; }` + +Gets or sets the Dataverse environment URL. +Example: https://contoso-dev.crm.dynamics.com + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/EnvironmentResolver.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/EnvironmentResolver.md new file mode 100644 index 0000000..4a3ef75 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/EnvironmentResolver.md @@ -0,0 +1,53 @@ + + +# EnvironmentResolver + +- Namespace: `PPDS.Dataverse.Configuration` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Resolves named environments from DataverseOptions. + +## Members + +### Methods + +#### GetDefaultEnvironment + +`DataverseEnvironmentOptions GetDefaultEnvironment(DataverseOptions options)` + +Gets the default environment from the configuration. +Falls back to creating an environment from root-level Connections if no environments are defined. + +- Param `options`: The Dataverse options. + +- Returns: The default environment configuration. + +#### GetEnvironment + +`DataverseEnvironmentOptions GetEnvironment(DataverseOptions options, string environmentName)` + +Gets a named environment from the configuration. +Environment name matching is case-insensitive. + +- Param `options`: The Dataverse options. + +- Param `environmentName`: The environment name to retrieve. + +- Returns: The environment configuration. + +#### GetEnvironmentNames + +`IEnumerable GetEnvironmentNames(DataverseOptions options)` + +Gets all environment names. + +#### HasEnvironment + +`bool HasEnvironment(DataverseOptions options, string environmentName)` + +Checks if a named environment exists in the configuration. +Environment name matching is case-insensitive. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/OAuthLoginPrompt.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/OAuthLoginPrompt.md new file mode 100644 index 0000000..cdcd708 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/OAuthLoginPrompt.md @@ -0,0 +1,41 @@ + + +# OAuthLoginPrompt + +- Namespace: `PPDS.Dataverse.Configuration` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +OAuth login prompt behavior. + +## Members + +### Fields + +#### Always + +`OAuthLoginPrompt Always` + +Always prompt for credentials. + +#### Auto + +`OAuthLoginPrompt Auto` + +Attempt silent authentication, prompt only if needed. + +#### Never + +`OAuthLoginPrompt Never` + +Never prompt - fail if silent auth is not possible. + +#### SelectAccount + +`OAuthLoginPrompt SelectAccount` + +Force re-authentication by discarding cached credentials. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/SecretResolver.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/SecretResolver.md new file mode 100644 index 0000000..dfdc0ea --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Configuration/SecretResolver.md @@ -0,0 +1,38 @@ + + +# SecretResolver + +- Namespace: `PPDS.Dataverse.Configuration` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Resolves secrets from various sources. +Priority: Key Vault URI > Direct Value + +## Members + +### Methods + +#### ResolveAsync + +`Task ResolveAsync(string keyVaultUri, string directValue, CancellationToken cancellationToken)` + +Resolves a secret value from the configured sources. + +- Param `keyVaultUri`: Azure Key Vault secret URI (highest priority). + +- Param `directValue`: Direct value from configuration. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The resolved secret value, or null if not configured. + +#### ResolveSync + +`string ResolveSync(string keyVaultUri, string directValue)` + +Resolves a secret value synchronously. +Only supports direct values (Key Vault requires async). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/DependencyInjection/DataverseOptions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/DependencyInjection/DataverseOptions.md new file mode 100644 index 0000000..1480161 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/DependencyInjection/DataverseOptions.md @@ -0,0 +1,71 @@ + + +# DataverseOptions + +- Namespace: `PPDS.Dataverse.DependencyInjection` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Root configuration options for Dataverse connection pooling and operations. +Supports both single-environment (Connections) and multi-environment (Environments) configurations. + +## Members + +### Properties + +#### BulkOperations + +`BulkOperationOptions BulkOperations { get; set; }` + +Gets or sets the bulk operation settings. + +#### Connections + +`List Connections { get; set; }` + +Gets or sets the connection configurations. +For single-environment scenarios, or as the default when no Environments are defined. + +#### DefaultEnvironment + +`string DefaultEnvironment { get; set; }` + +Gets or sets the default environment name. +Used when no environment is explicitly specified. + +#### Environments + +`Dictionary Environments { get; set; }` + +Gets or sets named environments for multi-environment scenarios. +Use this for source/target migration scenarios or dev/qa/prod configurations. +Key: environment name (e.g., "source", "target", "dev", "prod") + +#### Pool + +`ConnectionPoolOptions Pool { get; set; }` + +Gets or sets the connection pool settings. + +#### Resilience + +`ResilienceOptions Resilience { get; set; }` + +Gets or sets the resilience and retry settings. + +#### TenantId + +`string TenantId { get; set; }` + +Gets or sets the default Azure AD tenant ID. +Can be overridden at the connection or environment level. + +#### Url + +`string Url { get; set; }` + +Gets or sets the default Dataverse environment URL. +Can be overridden at the connection or environment level. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/DependencyInjection/ServiceCollectionExtensions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/DependencyInjection/ServiceCollectionExtensions.md new file mode 100644 index 0000000..67562bd --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/DependencyInjection/ServiceCollectionExtensions.md @@ -0,0 +1,57 @@ + + +# ServiceCollectionExtensions + +- Namespace: `PPDS.Dataverse.DependencyInjection` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Extension methods for configuring Dataverse services in an `Microsoft.Extensions.DependencyInjection.IServiceCollection`. + +## Members + +### Methods + +#### AddDataverseConnectionPool + +`IServiceCollection AddDataverseConnectionPool(IServiceCollection services, Action configure)` + +Adds Dataverse connection pooling services with a configuration action. + +- Param `services`: The service collection. + +- Param `configure`: Action to configure options. + +- Returns: The service collection for chaining. + +#### AddDataverseConnectionPool + +`IServiceCollection AddDataverseConnectionPool(IServiceCollection services, IConfiguration configuration, string environment, string sectionName)` + +Adds Dataverse connection pooling services from configuration. + +- Param `services`: The service collection. + +- Param `configuration`: The configuration root. + +- Param `environment`: Optional environment name. When specified, uses the connections from that +named environment (Environments dictionary) instead of root-level Connections. +When not specified but Environments are defined, uses DefaultEnvironment or the first environment. + +- Param `sectionName`: The configuration section name. Default: "Dataverse" + +- Returns: The service collection for chaining. + +#### RegisterDataverseServices + +`IServiceCollection RegisterDataverseServices(IServiceCollection services)` + +Registers core Dataverse services including throttle tracking and pool-consuming services. +Called by both library registration and CLI ProfileServiceFactory. + +- Param `services`: The service collection. + +- Returns: The service collection for chaining. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Diagnostics/CorrelationIdScope.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Diagnostics/CorrelationIdScope.md new file mode 100644 index 0000000..b14ed89 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Diagnostics/CorrelationIdScope.md @@ -0,0 +1,49 @@ + + +# CorrelationIdScope + +- Namespace: `PPDS.Dataverse.Diagnostics` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Ambient correlation-ID scope shared by the CLI, the RPC daemon, and every +Dataverse service called from either surface. + +## Members + +### Methods + +#### NewId + +`string NewId()` + +Generates a new GUID-based correlation id (lowercase hyphenated form). +Callers should prefer `PPDS.Dataverse.Diagnostics.CorrelationIdScope.Push(System.String)` to install a value; +this helper exists so CLI entrypoints can seed the initial id without +duplicating the format string. + +#### Push + +`IDisposable Push(string correlationId)` + +Establishes a correlation-id scope for the lifetime of the returned +`System.IDisposable`. The previous value is restored on dispose so +nested scopes (e.g., CLI entry → per-RPC-call) behave correctly. + +- Param `correlationId`: The correlation id to install. A `null` or whitespace +value is treated as "clear the slot" for this scope. + +- Returns: A disposable handle that restores the previous value. + + +### Properties + +#### Current + +`string Current { get; }` + +Gets the correlation id for the current async flow, or `null` +when no scope is active. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/AsyncOperation.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/AsyncOperation.md new file mode 100644 index 0000000..1a540a2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/AsyncOperation.md @@ -0,0 +1,405 @@ + + +# AsyncOperation + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Process whose execution can proceed independently or in the background. + +## Members + +### Constructors + +#### AsyncOperation() + +`AsyncOperation()` + +Default Constructor. + + +### Properties + +#### AsyncOperationId + +`Nullable AsyncOperationId { get; set; }` + +Unique identifier of the system job. + +#### BreadcrumbId + +`Nullable BreadcrumbId { get; set; }` + +The breadcrumb record ID. + +#### CallerOrigin + +`string CallerOrigin { get; set; }` + +The origin of the caller. + +#### CompletedOn + +`Nullable CompletedOn { get; }` + +Date and time when the system job was completed. + +#### CorrelationId + +`Nullable CorrelationId { get; set; }` + +Unique identifier used to correlate between multiple SDK requests and system jobs. + +#### CorrelationUpdatedTime + +`Nullable CorrelationUpdatedTime { get; set; }` + +Last time the correlation depth was updated. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the system job. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the system job was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the asyncoperation. + +#### Data + +`string Data { get; set; }` + +Unstructured data associated with the system job. + +#### DataBlobId + +`Nullable DataBlobId { get; }` + +File Id for the blob url used for file storage. + +#### DependencyToken + +`string DependencyToken { get; set; }` + +Execution of all operations with the same dependency token is serialized. + +#### Depth + +`Nullable Depth { get; set; }` + +Number of SDK calls made since the first call. + +#### ErrorCode + +`Nullable ErrorCode { get; }` + +Error code returned from a canceled system job. + +#### ExecutionTimeSpan + +`Nullable ExecutionTimeSpan { get; }` + +Time that the system job has taken to execute. + +#### ExpanderStartTime + +`Nullable ExpanderStartTime { get; set; }` + +The datetime when the Expander pipeline started. + +#### FriendlyMessage + +`string FriendlyMessage { get; set; }` + +Message provided by the system job. + +#### HostId + +`string HostId { get; set; }` + +Unique identifier of the host that owns this system job. + +#### IsWaitingForEvent + +`Nullable IsWaitingForEvent { get; }` + +Indicates that the system job is waiting for an event. + +#### Message + +`string Message { get; }` + +Message related to the system job. + +#### MessageName + +`string MessageName { get; set; }` + +Name of the message that started this system job. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the system job. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the system job was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who last modified the asyncoperation. + +#### Name + +`string Name { get; set; }` + +Name of the system job. + +#### OperationType + +`Nullable OperationType { get; set; }` + +Type of the system job. + +#### OwnerId + +`EntityReference OwnerId { get; set; }` + +Unique identifier of the user or team who owns the system job. + +#### OwningBusinessUnit + +`EntityReference OwningBusinessUnit { get; }` + +Unique identifier of the business unit that owns the system job. + +#### OwningExtensionId + +`EntityReference OwningExtensionId { get; set; }` + +Unique identifier of the owning extension with which the system job is associated. + +#### OwningTeam + +`EntityReference OwningTeam { get; }` + +Unique identifier of the team who owns the record. + +#### OwningUser + +`EntityReference OwningUser { get; }` + +Unique identifier of the user who owns the record. + +#### PostponeUntil + +`Nullable PostponeUntil { get; set; }` + +Indicates whether the system job should run only after the specified date and time. + +#### PrimaryEntityType + +`string PrimaryEntityType { get; set; }` + +Type of entity with which the system job is primarily associated. + +#### RecurrencePattern + +`string RecurrencePattern { get; set; }` + +Pattern of the system job's recurrence. + +#### RecurrenceStartTime + +`Nullable RecurrenceStartTime { get; set; }` + +Starting time in UTC for the recurrence pattern. + +#### RegardingObjectId + +`EntityReference RegardingObjectId { get; set; }` + +Unique identifier of the object with which the system job is associated. + +#### RequestId + +`Nullable RequestId { get; set; }` + +Unique identifier of the request that generated the system job. + +#### RetainJobHistory + +`Nullable RetainJobHistory { get; set; }` + +Retain job history. + +#### RetryCount + +`Nullable RetryCount { get; }` + +Number of times to retry the system job. + +#### Role_AsyncOperations + +`Role Role_AsyncOperations { get; set; }` + +N:1 Role_AsyncOperations + +#### RootExecutionContext + +`string RootExecutionContext { get; set; }` + +Root execution context of the job that trigerred async job. + +#### SdkMessageProcessingStep_AsyncOperations + +`SdkMessageProcessingStep SdkMessageProcessingStep_AsyncOperations { get; set; }` + +N:1 SdkMessageProcessingStep_AsyncOperations + +#### Sequence + +`Nullable Sequence { get; }` + +Order in which operations were submitted. + +#### StartedOn + +`Nullable StartedOn { get; }` + +Date and time when the system job was started. + +#### StateCode + +`Nullable StateCode { get; set; }` + +Status of the system job. + +#### StatusCode + +`Nullable StatusCode { get; set; }` + +Reason for the status of the system job. + +#### Subtype + +`Nullable Subtype { get; }` + +The Subtype of the Async Job + +#### SystemUser_AsyncOperations + +`SystemUser SystemUser_AsyncOperations { get; set; }` + +N:1 SystemUser_AsyncOperations + +#### TimeZoneRuleVersionNumber + +`Nullable TimeZoneRuleVersionNumber { get; set; }` + +For internal use only. + +#### UTCConversionTimeZoneCode + +`Nullable UTCConversionTimeZoneCode { get; set; }` + +Time zone code that was in use when the record was created. + +#### WorkflowActivationId + +`EntityReference WorkflowActivationId { get; set; }` + +Unique identifier of the workflow activation related to the system job. + +#### WorkflowStageName + +`string WorkflowStageName { get; }` + +Name of a workflow stage. + +#### Workload + +`string Workload { get; set; }` + +The workload name. + +#### connectionreference_AsyncOperations + +`ConnectionReference connectionreference_AsyncOperations { get; set; }` + +N:1 connectionreference_AsyncOperations + +#### environmentvariabledefinition_AsyncOperations + +`EnvironmentVariableDefinition environmentvariabledefinition_AsyncOperations { get; set; }` + +N:1 environmentvariabledefinition_AsyncOperations + +#### environmentvariablevalue_AsyncOperations + +`EnvironmentVariableValue environmentvariablevalue_AsyncOperations { get; set; }` + +N:1 environmentvariablevalue_AsyncOperations + +#### lk_asyncoperation_createdby + +`SystemUser lk_asyncoperation_createdby { get; }` + +N:1 lk_asyncoperation_createdby + +#### lk_asyncoperation_createdonbehalfby + +`SystemUser lk_asyncoperation_createdonbehalfby { get; }` + +N:1 lk_asyncoperation_createdonbehalfby + +#### lk_asyncoperation_modifiedby + +`SystemUser lk_asyncoperation_modifiedby { get; }` + +N:1 lk_asyncoperation_modifiedby + +#### lk_asyncoperation_modifiedonbehalfby + +`SystemUser lk_asyncoperation_modifiedonbehalfby { get; }` + +N:1 lk_asyncoperation_modifiedonbehalfby + +#### lk_asyncoperation_workflowactivationid + +`Workflow lk_asyncoperation_workflowactivationid { get; set; }` + +N:1 lk_asyncoperation_workflowactivationid + +#### pluginpackage_AsyncOperations + +`PluginPackage pluginpackage_AsyncOperations { get; set; }` + +N:1 pluginpackage_AsyncOperations + +#### system_user_asyncoperation + +`SystemUser system_user_asyncoperation { get; }` + +N:1 system_user_asyncoperation + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/CustomAPI.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/CustomAPI.md new file mode 100644 index 0000000..6f15f08 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/CustomAPI.md @@ -0,0 +1,261 @@ + + +# CustomAPI + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Entity that defines a custom API + +## Members + +### Constructors + +#### CustomAPI() + +`CustomAPI()` + +Default Constructor. + + +### Properties + +#### AllowedCustomProcessingStepType + +`Nullable AllowedCustomProcessingStepType { get; set; }` + +The type of custom processing step allowed + +#### BindingType + +`Nullable BindingType { get; set; }` + +The binding type of the custom API + +#### BoundEntityLogicalName + +`string BoundEntityLogicalName { get; set; }` + +The logical name of the entity bound to the custom API + +#### ComponentIdUnique + +`Nullable ComponentIdUnique { get; }` + +For internal use only. + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the record. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the record was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the record. + +#### CustomAPIId + +`Nullable CustomAPIId { get; set; }` + +Unique identifier for custom API instances + +#### Description + +`string Description { get; set; }` + +Localized description for custom API instances + +#### DisplayName + +`string DisplayName { get; set; }` + +Localized display name for custom API instances + +#### ExecutePrivilegeName + +`string ExecutePrivilegeName { get; set; }` + +Name of the privilege that allows execution of the custom API + +#### FxExpressionId + +`EntityReference FxExpressionId { get; set; }` + +Unique identifier for fxexpression associated with Custom API. + +#### ImportSequenceNumber + +`Nullable ImportSequenceNumber { get; set; }` + +Sequence number of the import that created this record. + +#### IsCustomizable + +`BooleanManagedProperty IsCustomizable { get; set; }` + +For internal use only. + +#### IsFunction + +`Nullable IsFunction { get; set; }` + +Indicates if the custom API is a function (GET is supported) or not (POST is supported) + +#### IsManaged + +`Nullable IsManaged { get; }` + +Indicates whether the solution component is part of a managed solution. + +#### IsPrivate + +`Nullable IsPrivate { get; set; }` + +Indicates if the custom API is private (hidden from metadata and documentation) + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who modified the record. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the record was modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who modified the record. + +#### Name + +`string Name { get; set; }` + +The primary name of the custom API + +#### OverriddenCreatedOn + +`Nullable OverriddenCreatedOn { get; set; }` + +Date and time that the record was migrated. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### OwnerId + +`EntityReference OwnerId { get; set; }` + +Owner Id + +#### OwningBusinessUnit + +`EntityReference OwningBusinessUnit { get; }` + +Unique identifier for the business unit that owns the record + +#### OwningTeam + +`EntityReference OwningTeam { get; }` + +Unique identifier for the team that owns the record. + +#### OwningUser + +`EntityReference OwningUser { get; }` + +Unique identifier for the user that owns the record. + +#### PowerfxRuleId + +`EntityReference PowerfxRuleId { get; set; }` + +Unique identifier for powerfxrule associated with Custom API. + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### TimeZoneRuleVersionNumber + +`Nullable TimeZoneRuleVersionNumber { get; set; }` + +For internal use only. + +#### UTCConversionTimeZoneCode + +`Nullable UTCConversionTimeZoneCode { get; set; }` + +Time zone code that was in use when the record was created. + +#### UniqueName + +`string UniqueName { get; set; }` + +Unique name for the custom API + +#### VersionNumber + +`Nullable VersionNumber { get; }` + +Version Number + +#### WorkflowSdkStepEnabled + +`Nullable WorkflowSdkStepEnabled { get; set; }` + +Indicates if the custom API is enabled as a workflow action + +#### customapi_customapirequestparameter + +`IEnumerable customapi_customapirequestparameter { get; set; }` + +1:N customapi_customapirequestparameter + +#### customapi_customapiresponseproperty + +`IEnumerable customapi_customapiresponseproperty { get; set; }` + +1:N customapi_customapiresponseproperty + +#### statecode + +`Nullable statecode { get; set; }` + +Status of the Custom API + +#### statuscode + +`Nullable statuscode { get; set; }` + +Reason for the status of the Custom API + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/CustomAPIRequestParameter.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/CustomAPIRequestParameter.md new file mode 100644 index 0000000..3bae06c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/CustomAPIRequestParameter.md @@ -0,0 +1,225 @@ + + +# CustomAPIRequestParameter + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Entity that defines a request parameter for a custom API + +## Members + +### Constructors + +#### CustomAPIRequestParameter() + +`CustomAPIRequestParameter()` + +Default Constructor. + + +### Properties + +#### ComponentIdUnique + +`Nullable ComponentIdUnique { get; }` + +For internal use only. + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the record. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the record was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the record. + +#### CustomAPIId + +`EntityReference CustomAPIId { get; set; }` + +Unique identifier for the custom API that owns this custom API request parameter + +#### CustomAPIRequestParameterId + +`Nullable CustomAPIRequestParameterId { get; set; }` + +Unique identifier for custom API request parameter instances + +#### Description + +`string Description { get; set; }` + +Localized description for custom API request parameter instances + +#### DisplayName + +`string DisplayName { get; set; }` + +Localized display name for custom API request parameter instances + +#### ImportSequenceNumber + +`Nullable ImportSequenceNumber { get; set; }` + +Sequence number of the import that created this record. + +#### IsCustomizable + +`BooleanManagedProperty IsCustomizable { get; set; }` + +For internal use only. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Indicates whether the solution component is part of a managed solution. + +#### IsOptional + +`Nullable IsOptional { get; set; }` + +Indicates if the custom API request parameter is optional + +#### LogicalEntityName + +`string LogicalEntityName { get; set; }` + +The logical name of the entity bound to the custom API request parameter + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who modified the record. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the record was modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who modified the record. + +#### Name + +`string Name { get; set; }` + +The primary name of the custom API request parameter + +#### OverriddenCreatedOn + +`Nullable OverriddenCreatedOn { get; set; }` + +Date and time that the record was migrated. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### OwnerId + +`EntityReference OwnerId { get; }` + +Owner Id + +#### OwningBusinessUnit + +`EntityReference OwningBusinessUnit { get; }` + +Unique identifier for the business unit that owns the record + +#### OwningTeam + +`EntityReference OwningTeam { get; }` + +Unique identifier for the team that owns the record. + +#### OwningUser + +`EntityReference OwningUser { get; }` + +Unique identifier for the user that owns the record. + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### TimeZoneRuleVersionNumber + +`Nullable TimeZoneRuleVersionNumber { get; set; }` + +For internal use only. + +#### Type + +`Nullable Type { get; set; }` + +The data type of the custom API request parameter + +#### UTCConversionTimeZoneCode + +`Nullable UTCConversionTimeZoneCode { get; set; }` + +Time zone code that was in use when the record was created. + +#### UniqueName + +`string UniqueName { get; set; }` + +Unique name for the custom API request parameter + +#### VersionNumber + +`Nullable VersionNumber { get; }` + +Version Number + +#### customapi_customapirequestparameter + +`CustomAPI customapi_customapirequestparameter { get; set; }` + +N:1 customapi_customapirequestparameter + +#### statecode + +`Nullable statecode { get; set; }` + +Status of the Custom API Request Parameter + +#### statuscode + +`Nullable statuscode { get; set; }` + +Reason for the status of the Custom API Request Parameter + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/CustomAPIResponseProperty.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/CustomAPIResponseProperty.md new file mode 100644 index 0000000..68a0aa8 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/CustomAPIResponseProperty.md @@ -0,0 +1,219 @@ + + +# CustomAPIResponseProperty + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Entity that defines a response property for a custom API + +## Members + +### Constructors + +#### CustomAPIResponseProperty() + +`CustomAPIResponseProperty()` + +Default Constructor. + + +### Properties + +#### ComponentIdUnique + +`Nullable ComponentIdUnique { get; }` + +For internal use only. + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the record. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the record was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the record. + +#### CustomAPIId + +`EntityReference CustomAPIId { get; set; }` + +Unique identifier for the custom API that owns this custom API response property + +#### CustomAPIResponsePropertyId + +`Nullable CustomAPIResponsePropertyId { get; set; }` + +Unique identifier for custom API response property instances + +#### Description + +`string Description { get; set; }` + +Localized description for custom API response property instances + +#### DisplayName + +`string DisplayName { get; set; }` + +Localized display name for custom API response property instances + +#### ImportSequenceNumber + +`Nullable ImportSequenceNumber { get; set; }` + +Sequence number of the import that created this record. + +#### IsCustomizable + +`BooleanManagedProperty IsCustomizable { get; set; }` + +For internal use only. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Indicates whether the solution component is part of a managed solution. + +#### LogicalEntityName + +`string LogicalEntityName { get; set; }` + +The logical name of the entity bound to the custom API response property + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who modified the record. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the record was modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who modified the record. + +#### Name + +`string Name { get; set; }` + +The primary name of the custom API response property + +#### OverriddenCreatedOn + +`Nullable OverriddenCreatedOn { get; set; }` + +Date and time that the record was migrated. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### OwnerId + +`EntityReference OwnerId { get; }` + +Owner Id + +#### OwningBusinessUnit + +`EntityReference OwningBusinessUnit { get; }` + +Unique identifier for the business unit that owns the record + +#### OwningTeam + +`EntityReference OwningTeam { get; }` + +Unique identifier for the team that owns the record. + +#### OwningUser + +`EntityReference OwningUser { get; }` + +Unique identifier for the user that owns the record. + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### TimeZoneRuleVersionNumber + +`Nullable TimeZoneRuleVersionNumber { get; set; }` + +For internal use only. + +#### Type + +`Nullable Type { get; set; }` + +The data type of the custom API response property + +#### UTCConversionTimeZoneCode + +`Nullable UTCConversionTimeZoneCode { get; set; }` + +Time zone code that was in use when the record was created. + +#### UniqueName + +`string UniqueName { get; set; }` + +Unique name for the custom API response property + +#### VersionNumber + +`Nullable VersionNumber { get; }` + +Version Number + +#### customapi_customapiresponseproperty + +`CustomAPI customapi_customapiresponseproperty { get; set; }` + +N:1 customapi_customapiresponseproperty + +#### statecode + +`Nullable statecode { get; set; }` + +Status of the Custom API Response Property + +#### statuscode + +`Nullable statuscode { get; set; }` + +Reason for the status of the Custom API Response Property + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/EntityDataProvider.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/EntityDataProvider.md new file mode 100644 index 0000000..8f88000 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/EntityDataProvider.md @@ -0,0 +1,225 @@ + + +# EntityDataProvider + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Developers can register plug-ins on a data provider to enable data access for virtual entities in the system. + +## Members + +### Constructors + +#### EntityDataProvider() + +`EntityDataProvider()` + +Default Constructor. + + +### Properties + +#### ArchivePlugin + +`Nullable ArchivePlugin { get; set; }` + +Contains the archiveplugin id that should be run when Archive is invoked + +#### BulkArchivePlugin + +`Nullable BulkArchivePlugin { get; set; }` + +Contains the bulkarchiveplugin id that should be run when BulkArchive is invoked + +#### BulkRetainPlugin + +`Nullable BulkRetainPlugin { get; set; }` + +Contains the bulkretainplugin id that should be run when BulkRetain is invoked + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### CreateMultiplePlugin + +`Nullable CreateMultiplePlugin { get; set; }` + +Contains the createmultipleplugin id that should be run when CreateMultiple is invoked + +#### CreatePlugin + +`Nullable CreatePlugin { get; set; }` + +Create Plugin + +#### DataSourceLogicalName + +`string DataSourceLogicalName { get; set; }` + +When creating a Data Provider, the end user must select the name of the Data Source entity that will be created for the provider. + +#### DeleteMultiplePlugin + +`Nullable DeleteMultiplePlugin { get; set; }` + +Contains the deletemultipleplugin id that should be run when DeleteMultiple is invoked + +#### DeletePlugin + +`Nullable DeletePlugin { get; set; }` + +Delete Plugin + +#### Description + +`string Description { get; set; }` + +What is this Data Provider used for and data store technologies does it target? + +#### EntityDataProviderId + +`Nullable EntityDataProviderId { get; set; }` + +Unique identifier of the data provider. + +#### EntityDataProviderIdUnique + +`Nullable EntityDataProviderIdUnique { get; }` + +For internal use only. + +#### IntroducedVersion + +`string IntroducedVersion { get; set; }` + +Version in which the form is introduced. + +#### IsCustomizable + +`BooleanManagedProperty IsCustomizable { get; set; }` + +Information that specifies whether this component can be customized. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Indicates whether the solution component is part of a managed solution. + +#### LookupExpansionEnabled + +`Nullable LookupExpansionEnabled { get; set; }` + +Enables expansion support for lookups columns. Only applicable to RetrieveMultiple plugin. Enabling this might modify the filter expression supplied to RetrieveMultiple plugin. Default value is false. + +#### Name + +`string Name { get; set; }` + +The name of this Data Provider. This is the name that appears in the dropdown when creating a new entity. + +#### OrganizationId + +`Nullable OrganizationId { get; }` + +Unique identifier for the organization. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### PurgeArchivedContentPlugin + +`Nullable PurgeArchivedContentPlugin { get; set; }` + +Contains the purgearchivedcontentplugin id that should be run when PurgeArchivedContent is invoked + +#### PurgeRetainedContentPlugin + +`Nullable PurgeRetainedContentPlugin { get; set; }` + +Contains the purgeretainedcontentplugin id that should be run when PurgeRetainedContent is invoked + +#### RetainPlugin + +`Nullable RetainPlugin { get; set; }` + +Contains the retainplugin id that should be run when Retain is invoked + +#### RetrieveEntityChangesPlugin + +`Nullable RetrieveEntityChangesPlugin { get; set; }` + +Contains the retrieveentitychangesplugin id that should be run when RetrieveEntityChanges is invoked + +#### RetrieveMultiplePlugin + +`Nullable RetrieveMultiplePlugin { get; set; }` + +MultipleRetrieve Plugin + +#### RetrievePlugin + +`Nullable RetrievePlugin { get; set; }` + +Retrieve Plugin + +#### RollbackRetainPlugin + +`Nullable RollbackRetainPlugin { get; set; }` + +Contains the rollbackretainplugin id that should be run when Rollback Retain is invoked + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### UpdateMultiplePlugin + +`Nullable UpdateMultiplePlugin { get; set; }` + +Contains the updatemultipleplugin id that should be run when UpdateMultiple is invoked + +#### UpdatePlugin + +`Nullable UpdatePlugin { get; set; }` + +Update Plugin + +#### UpsertMultiplePlugin + +`Nullable UpsertMultiplePlugin { get; set; }` + +Contains the upsertmultipleplugin id that should be run when UpsertMultiple is invoked + +#### UpsertPlugin + +`Nullable UpsertPlugin { get; set; }` + +Contains the upsertplugin id that should be run when Upsert is invoked + +#### ValidateArchiveConfigPlugin + +`Nullable ValidateArchiveConfigPlugin { get; set; }` + +Contains the validatearchiveconfigplugin id that should be run when ValidateArchiveConfig is invoked + +#### ValidateRetentionConfigPlugin + +`Nullable ValidateRetentionConfigPlugin { get; set; }` + +Contains the validateretentionconfigplugin id that should be run when ValidateRetentionConfig is invoked + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/EnvironmentVariableDefinition.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/EnvironmentVariableDefinition.md new file mode 100644 index 0000000..7c9430d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/EnvironmentVariableDefinition.md @@ -0,0 +1,309 @@ + + +# EnvironmentVariableDefinition + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Contains information about the settable variable: its type, default value, and etc. + +## Members + +### Constructors + +#### EnvironmentVariableDefinition() + +`EnvironmentVariableDefinition()` + +Default Constructor. + + +### Properties + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### ConnectionReferenceId + +`EntityReference ConnectionReferenceId { get; set; }` + +Unique identifier for Connection Reference associated with Environment Variable Definition. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the record. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the record was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the record. + +#### DefaultValue + +`string DefaultValue { get; set; }` + +Default variable value to be used if no associated EnvironmentVariableValue entities exist. + +#### Description + +`string Description { get; set; }` + +Description of the variable definition. + +#### DisplayName + +`string DisplayName { get; set; }` + +Display Name of the variable definition. + +#### EnvironmentVariableDefinitionId + +`Nullable EnvironmentVariableDefinitionId { get; set; }` + +Unique identifier for entity instances + +#### EnvironmentVariableDefinitionIdUnique + +`Nullable EnvironmentVariableDefinitionIdUnique { get; }` + +For internal use only. + +#### Hint + +`string Hint { get; set; }` + +For internal use only. + +#### ImportSequenceNumber + +`Nullable ImportSequenceNumber { get; set; }` + +Sequence number of the import that created this record. + +#### InputControlConfig + +`string InputControlConfig { get; set; }` + +A JSON object describing the options for the input control that should be presented to the user for setting the current value of the Environment variable. + +#### IntroducedVersion + +`string IntroducedVersion { get; set; }` + +Version in which the form is introduced. + +#### IsCustomizable + +`BooleanManagedProperty IsCustomizable { get; set; }` + +Tells whether the component can be customized. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Indicates whether the solution component is part of a managed solution. + +#### IsRequired + +`Nullable IsRequired { get; set; }` + +For internal use only. + +#### LearnMoreUrl + +`string LearnMoreUrl { get; set; }` + +Clicking on this url will take the user to a webpage which further explains the environment variable being populated. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who modified the record. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the record was modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who modified the record. + +#### OverriddenCreatedOn + +`Nullable OverriddenCreatedOn { get; set; }` + +Date and time that the record was migrated. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### OwnerId + +`EntityReference OwnerId { get; set; }` + +Owner Id + +#### OwningBusinessUnit + +`EntityReference OwningBusinessUnit { get; }` + +Unique identifier for the business unit that owns the record + +#### OwningTeam + +`EntityReference OwningTeam { get; }` + +Unique identifier for the team that owns the record. + +#### OwningUser + +`EntityReference OwningUser { get; }` + +Unique identifier for the user that owns the record. + +#### ParentDefinitionId + +`EntityReference ParentDefinitionId { get; set; }` + +Unique identifier for Environment Variable Definition associated with Environment Variable Definition. + +#### Referencedenvdefinition_envdefinition + +`IEnumerable Referencedenvdefinition_envdefinition { get; set; }` + +1:N envdefinition_envdefinition + +#### Referencingenvdefinition_envdefinition + +`EnvironmentVariableDefinition Referencingenvdefinition_envdefinition { get; set; }` + +N:1 envdefinition_envdefinition + +#### SchemaName + +`string SchemaName { get; set; }` + +Unique entity name. + +#### SecretStore + +`Nullable SecretStore { get; set; }` + +Environment variable secret store. + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### TimeZoneRuleVersionNumber + +`Nullable TimeZoneRuleVersionNumber { get; set; }` + +For internal use only. + +#### Type + +`Nullable Type { get; set; }` + +Environment variable value type. + +#### UTCConversionTimeZoneCode + +`Nullable UTCConversionTimeZoneCode { get; set; }` + +Time zone code that was in use when the record was created. + +#### ValueSchema + +`string ValueSchema { get; set; }` + +For internal use only. + +#### VersionNumber + +`Nullable VersionNumber { get; }` + +Version Number + +#### environmentvariabledefinition_AsyncOperations + +`IEnumerable environmentvariabledefinition_AsyncOperations { get; set; }` + +1:N environmentvariabledefinition_AsyncOperations + +#### environmentvariabledefinition_environmentvariablevalue + +`IEnumerable environmentvariabledefinition_environmentvariablevalue { get; set; }` + +1:N environmentvariabledefinition_environmentvariablevalue + +#### lk_environmentvariabledefinition_createdby + +`SystemUser lk_environmentvariabledefinition_createdby { get; }` + +N:1 lk_environmentvariabledefinition_createdby + +#### lk_environmentvariabledefinition_createdonbehalfby + +`SystemUser lk_environmentvariabledefinition_createdonbehalfby { get; }` + +N:1 lk_environmentvariabledefinition_createdonbehalfby + +#### lk_environmentvariabledefinition_modifiedby + +`SystemUser lk_environmentvariabledefinition_modifiedby { get; }` + +N:1 lk_environmentvariabledefinition_modifiedby + +#### lk_environmentvariabledefinition_modifiedonbehalfby + +`SystemUser lk_environmentvariabledefinition_modifiedonbehalfby { get; }` + +N:1 lk_environmentvariabledefinition_modifiedonbehalfby + +#### statecode + +`Nullable statecode { get; set; }` + +Status of the Environment Variable Definition + +#### statuscode + +`Nullable statuscode { get; set; }` + +Reason for the status of the Environment Variable Definition + +#### user_environmentvariabledefinition + +`SystemUser user_environmentvariabledefinition { get; }` + +N:1 user_environmentvariabledefinition + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/EnvironmentVariableValue.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/EnvironmentVariableValue.md new file mode 100644 index 0000000..9fa9180 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/EnvironmentVariableValue.md @@ -0,0 +1,231 @@ + + +# EnvironmentVariableValue + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Holds the value for the associated EnvironmentVariableDefinition entity. + +## Members + +### Constructors + +#### EnvironmentVariableValue() + +`EnvironmentVariableValue()` + +Default Constructor. + + +### Properties + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the record. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the record was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the record. + +#### EnvironmentVariableDefinitionId + +`EntityReference EnvironmentVariableDefinitionId { get; set; }` + +Unique identifier for Environment Variable Definition associated with Environment Variable Value. + +#### EnvironmentVariableValueId + +`Nullable EnvironmentVariableValueId { get; set; }` + +Unique identifier for entity instances + +#### EnvironmentVariableValueIdUnique + +`Nullable EnvironmentVariableValueIdUnique { get; }` + +For internal use only. + +#### ImportSequenceNumber + +`Nullable ImportSequenceNumber { get; set; }` + +Sequence number of the import that created this record. + +#### IntroducedVersion + +`string IntroducedVersion { get; set; }` + +Version in which the form is introduced. + +#### IsCustomizable + +`BooleanManagedProperty IsCustomizable { get; set; }` + +Tells whether the component can be customized. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Indicates whether the solution component is part of a managed solution. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who modified the record. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the record was modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who modified the record. + +#### OverriddenCreatedOn + +`Nullable OverriddenCreatedOn { get; set; }` + +Date and time that the record was migrated. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### OwnerId + +`EntityReference OwnerId { get; }` + +Owner Id + +#### OwningBusinessUnit + +`EntityReference OwningBusinessUnit { get; }` + +Unique identifier for the business unit that owns the record + +#### OwningTeam + +`EntityReference OwningTeam { get; }` + +Unique identifier for the team that owns the record. + +#### OwningUser + +`EntityReference OwningUser { get; }` + +Unique identifier for the user that owns the record. + +#### SchemaName + +`string SchemaName { get; set; }` + +Unique entity name. + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### TimeZoneRuleVersionNumber + +`Nullable TimeZoneRuleVersionNumber { get; set; }` + +For internal use only. + +#### UTCConversionTimeZoneCode + +`Nullable UTCConversionTimeZoneCode { get; set; }` + +Time zone code that was in use when the record was created. + +#### Value + +`string Value { get; set; }` + +Contains the actual variable data. + +#### VersionNumber + +`Nullable VersionNumber { get; }` + +Version Number + +#### environmentvariabledefinition_environmentvariablevalue + +`EnvironmentVariableDefinition environmentvariabledefinition_environmentvariablevalue { get; set; }` + +N:1 environmentvariabledefinition_environmentvariablevalue + +#### environmentvariablevalue_AsyncOperations + +`IEnumerable environmentvariablevalue_AsyncOperations { get; set; }` + +1:N environmentvariablevalue_AsyncOperations + +#### lk_environmentvariablevalue_createdby + +`SystemUser lk_environmentvariablevalue_createdby { get; }` + +N:1 lk_environmentvariablevalue_createdby + +#### lk_environmentvariablevalue_createdonbehalfby + +`SystemUser lk_environmentvariablevalue_createdonbehalfby { get; }` + +N:1 lk_environmentvariablevalue_createdonbehalfby + +#### lk_environmentvariablevalue_modifiedby + +`SystemUser lk_environmentvariablevalue_modifiedby { get; }` + +N:1 lk_environmentvariablevalue_modifiedby + +#### lk_environmentvariablevalue_modifiedonbehalfby + +`SystemUser lk_environmentvariablevalue_modifiedonbehalfby { get; }` + +N:1 lk_environmentvariablevalue_modifiedonbehalfby + +#### statecode + +`Nullable statecode { get; set; }` + +Status of the Environment Variable Value + +#### statuscode + +`Nullable statuscode { get; set; }` + +Reason for the status of the Environment Variable Value + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/ImportJob.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/ImportJob.md new file mode 100644 index 0000000..8dc62a1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/ImportJob.md @@ -0,0 +1,165 @@ + + +# ImportJob + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +For internal use only. + +## Members + +### Constructors + +#### ImportJob() + +`ImportJob()` + +Default Constructor. + + +### Properties + +#### CompletedOn + +`Nullable CompletedOn { get; }` + +Date and time when the import job was completed. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the importJob. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the import job record was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the import job record. + +#### Data + +`string Data { get; set; }` + +Unstructured data associated with the import job. + +#### ImportContext + +`string ImportContext { get; set; }` + +The context of the import + +#### ImportJobId + +`Nullable ImportJobId { get; set; }` + +Unique identifier of the import job. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who modified the importJob. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the import job was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who modified the import job record. + +#### Name + +`string Name { get; set; }` + +Name of the import job. + +#### OperationContext + +`string OperationContext { get; set; }` + +The context of the solution operation + +#### OrganizationId + +`EntityReference OrganizationId { get; }` + +Unique identifier of the organization associated with the importjob. + +#### Progress + +`Nullable Progress { get; set; }` + +Import Progress Percentage. + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### SolutionName + +`string SolutionName { get; set; }` + +Unique identifier of the solution. + +#### StartedOn + +`Nullable StartedOn { get; }` + +Date and time when the import job was started. + +#### TimeZoneRuleVersionNumber + +`Nullable TimeZoneRuleVersionNumber { get; set; }` + +For internal use only. + +#### UTCConversionTimeZoneCode + +`Nullable UTCConversionTimeZoneCode { get; set; }` + +Time zone code that was in use when the record was created. + +#### lk_importjobbase_createdby + +`SystemUser lk_importjobbase_createdby { get; }` + +N:1 lk_importjobbase_createdby + +#### lk_importjobbase_createdonbehalfby + +`SystemUser lk_importjobbase_createdonbehalfby { get; }` + +N:1 lk_importjobbase_createdonbehalfby + +#### lk_importjobbase_modifiedby + +`SystemUser lk_importjobbase_modifiedby { get; }` + +N:1 lk_importjobbase_modifiedby + +#### lk_importjobbase_modifiedonbehalfby + +`SystemUser lk_importjobbase_modifiedonbehalfby { get; }` + +N:1 lk_importjobbase_modifiedonbehalfby + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/PluginAssembly.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/PluginAssembly.md new file mode 100644 index 0000000..437f6b4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/PluginAssembly.md @@ -0,0 +1,273 @@ + + +# PluginAssembly + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Assembly that contains one or more plug-in types. + +## Members + +### Constructors + +#### PluginAssembly() + +`PluginAssembly()` + +Default Constructor. + + +### Properties + +#### AuthType + +`Nullable AuthType { get; set; }` + +Specifies mode of authentication with web sources like WebApp + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### Content + +`string Content { get; set; }` + +Bytes of the assembly, in Base64 format. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the plug-in assembly. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the plug-in assembly was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the pluginassembly. + +#### Culture + +`string Culture { get; set; }` + +Culture code for the plug-in assembly. + +#### CustomizationLevel + +`Nullable CustomizationLevel { get; }` + +Customization Level. + +#### Description + +`string Description { get; set; }` + +Description of the plug-in assembly. + +#### IntroducedVersion + +`string IntroducedVersion { get; set; }` + +Version in which the form is introduced. + +#### IsCustomizable + +`BooleanManagedProperty IsCustomizable { get; set; }` + +Information that specifies whether this component can be customized. + +#### IsHidden + +`BooleanManagedProperty IsHidden { get; set; }` + +Information that specifies whether this component should be hidden. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Information that specifies whether this component is managed. + +#### IsolationMode + +`Nullable IsolationMode { get; set; }` + +Information about how the plugin assembly is to be isolated at execution time; None / Sandboxed. + +#### Major + +`Nullable Major { get; }` + +Major of the assembly version. + +#### ManagedIdentityId + +`EntityReference ManagedIdentityId { get; set; }` + +Unique identifier for managedidentity associated with pluginassembly. + +#### Minor + +`Nullable Minor { get; }` + +Minor of the assembly version. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the plug-in assembly. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the plug-in assembly was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who last modified the pluginassembly. + +#### Name + +`string Name { get; set; }` + +Name of the plug-in assembly. + +#### OrganizationId + +`EntityReference OrganizationId { get; }` + +Unique identifier of the organization with which the plug-in assembly is associated. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### PackageId + +`EntityReference PackageId { get; set; }` + +Unique identifier for Plugin Package associated with Plug-in Assembly. + +#### Password + +`string Password { get; set; }` + +User Password + +#### Path + +`string Path { get; set; }` + +File name of the plug-in assembly. Used when the source type is set to 1. + +#### PluginAssemblyId + +`Nullable PluginAssemblyId { get; set; }` + +Unique identifier of the plug-in assembly. + +#### PluginAssemblyIdUnique + +`Nullable PluginAssemblyIdUnique { get; }` + +Unique identifier of the plug-in assembly. + +#### PublicKeyToken + +`string PublicKeyToken { get; set; }` + +Public key token of the assembly. This value can be obtained from the assembly by using reflection. + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### SourceHash + +`string SourceHash { get; set; }` + +Hash of the source of the assembly. + +#### SourceType + +`Nullable SourceType { get; set; }` + +Location of the assembly, for example 0=database, 1=on-disk. + +#### Url + +`string Url { get; set; }` + +Web Url + +#### UserName + +`string UserName { get; set; }` + +User Name + +#### Version + +`string Version { get; set; }` + +Version number of the assembly. The value can be obtained from the assembly through reflection. + +#### createdby_pluginassembly + +`SystemUser createdby_pluginassembly { get; }` + +N:1 createdby_pluginassembly + +#### lk_pluginassembly_createdonbehalfby + +`SystemUser lk_pluginassembly_createdonbehalfby { get; }` + +N:1 lk_pluginassembly_createdonbehalfby + +#### lk_pluginassembly_modifiedonbehalfby + +`SystemUser lk_pluginassembly_modifiedonbehalfby { get; }` + +N:1 lk_pluginassembly_modifiedonbehalfby + +#### modifiedby_pluginassembly + +`SystemUser modifiedby_pluginassembly { get; }` + +N:1 modifiedby_pluginassembly + +#### pluginassembly_plugintype + +`IEnumerable pluginassembly_plugintype { get; set; }` + +1:N pluginassembly_plugintype + +#### pluginpackage_pluginassembly + +`PluginPackage pluginpackage_pluginassembly { get; set; }` + +N:1 pluginpackage_pluginassembly + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/PluginTraceLog.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/PluginTraceLog.md new file mode 100644 index 0000000..b49f3d9 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/PluginTraceLog.md @@ -0,0 +1,189 @@ + + +# PluginTraceLog + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Trace and exception information generated by plug-ins and custom workflow activities. + +## Members + +### Constructors + +#### PluginTraceLog() + +`PluginTraceLog()` + +Default Constructor. + + +### Properties + +#### Configuration + +`string Configuration { get; }` + +Unsecured configuration for the plug-in trace log. + +#### CorrelationId + +`Nullable CorrelationId { get; }` + +Unique identifier for tracking plug-in or custom workflow activity execution. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the delegate user who created the record. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the record was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the record. + +#### Depth + +`Nullable Depth { get; }` + +Depth of execution of the plug-in or custom workflow activity. + +#### ExceptionDetails + +`string ExceptionDetails { get; }` + +Details of the exception. + +#### IsSystemCreated + +`Nullable IsSystemCreated { get; }` + +Where the event originated. Set to true if it's a system trace; otherwise, false. + +#### MessageBlock + +`string MessageBlock { get; }` + +Trace text from the plug-in. + +#### MessageName + +`string MessageName { get; }` + +Name of the message that triggered this plug-in. + +#### Mode + +`Nullable Mode { get; }` + +Type of execution. + +#### OperationType + +`Nullable OperationType { get; }` + +Type of custom code. + +#### OrganizationId + +`Nullable OrganizationId { get; }` + +Unique identifier for the organization. + +#### PerformanceConstructorDuration + +`Nullable PerformanceConstructorDuration { get; }` + +Time, in milliseconds, to construct. + +#### PerformanceConstructorStartTime + +`Nullable PerformanceConstructorStartTime { get; }` + +Date and time when constructed. + +#### PerformanceExecutionDuration + +`Nullable PerformanceExecutionDuration { get; }` + +Time, in milliseconds, to execute the request. + +#### PerformanceExecutionStartTime + +`Nullable PerformanceExecutionStartTime { get; }` + +Time, in milliseconds, to execute the request. + +#### PersistenceKey + +`Nullable PersistenceKey { get; }` + +Asynchronous workflow persistence key. + +#### PluginStepId + +`Nullable PluginStepId { get; }` + +ID of the plug-in registration step. + +#### PluginTraceLogId + +`Nullable PluginTraceLogId { get; }` + +Unique identifier for an entity instance. + +#### PrimaryEntity + +`string PrimaryEntity { get; }` + +Entity, if any, that the plug-in is executed against. + +#### Profile + +`string Profile { get; }` + +Plug-in profile formatted as serialized text. + +#### RequestId + +`Nullable RequestId { get; }` + +Unique identifier of the message request. + +#### SecureConfiguration + +`string SecureConfiguration { get; }` + +Secured configuration for the plug-in trace log. + +#### TypeName + +`string TypeName { get; }` + +Class name of the plug-in. + +#### createdby_plugintracelog + +`SystemUser createdby_plugintracelog { get; }` + +N:1 createdby_plugintracelog + +#### lk_plugintracelogbase_createdonbehalfby + +`SystemUser lk_plugintracelogbase_createdonbehalfby { get; }` + +N:1 lk_plugintracelogbase_createdonbehalfby + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/PluginType.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/PluginType.md new file mode 100644 index 0000000..e8d8195 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/PluginType.md @@ -0,0 +1,237 @@ + + +# PluginType + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Type that inherits from the IPlugin interface and is contained within a plug-in assembly. + +## Members + +### Constructors + +#### PluginType() + +`PluginType()` + +Default Constructor. + + +### Properties + +#### AssemblyName + +`string AssemblyName { get; }` + +Full path name of the plug-in assembly. + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the plug-in type. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the plug-in type was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the plugintype. + +#### Culture + +`string Culture { get; }` + +Culture code for the plug-in assembly. + +#### CustomWorkflowActivityInfo + +`string CustomWorkflowActivityInfo { get; }` + +Serialized Custom Activity Type information, including required arguments. For more information, see SandboxCustomActivityInfo. + +#### CustomizationLevel + +`Nullable CustomizationLevel { get; }` + +Customization level of the plug-in type. + +#### Description + +`string Description { get; set; }` + +Description of the plug-in type. + +#### FriendlyName + +`string FriendlyName { get; set; }` + +User friendly name for the plug-in. + +#### IsWorkflowActivity + +`Nullable IsWorkflowActivity { get; }` + +Indicates if the plug-in is a custom activity for workflows. + +#### Major + +`Nullable Major { get; }` + +Major of the version number of the assembly for the plug-in type. + +#### Minor + +`Nullable Minor { get; }` + +Minor of the version number of the assembly for the plug-in type. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the plug-in type. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the plug-in type was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who last modified the plugintype. + +#### Name + +`string Name { get; set; }` + +Name of the plug-in type. + +#### OrganizationId + +`EntityReference OrganizationId { get; }` + +Unique identifier of the organization with which the plug-in type is associated. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### PluginAssemblyId + +`EntityReference PluginAssemblyId { get; set; }` + +Unique identifier of the plug-in assembly that contains this plug-in type. + +#### PluginTypeExportKey + +`string PluginTypeExportKey { get; set; }` + +Uniquely identifies the plug-in type associated with a plugin package when exporting a solution. + +#### PluginTypeId + +`Nullable PluginTypeId { get; set; }` + +Unique identifier of the plug-in type. + +#### PluginTypeIdUnique + +`Nullable PluginTypeIdUnique { get; }` + +Unique identifier of the plug-in type. + +#### PublicKeyToken + +`string PublicKeyToken { get; }` + +Public key token of the assembly for the plug-in type. + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### TypeName + +`string TypeName { get; set; }` + +Fully qualified type name of the plug-in type. + +#### Version + +`string Version { get; }` + +Version number of the assembly for the plug-in type. + +#### WorkflowActivityGroupName + +`string WorkflowActivityGroupName { get; set; }` + +Group name of workflow custom activity. + +#### createdby_plugintype + +`SystemUser createdby_plugintype { get; }` + +N:1 createdby_plugintype + +#### lk_plugintype_createdonbehalfby + +`SystemUser lk_plugintype_createdonbehalfby { get; }` + +N:1 lk_plugintype_createdonbehalfby + +#### lk_plugintype_modifiedonbehalfby + +`SystemUser lk_plugintype_modifiedonbehalfby { get; }` + +N:1 lk_plugintype_modifiedonbehalfby + +#### modifiedby_plugintype + +`SystemUser modifiedby_plugintype { get; }` + +N:1 modifiedby_plugintype + +#### pluginassembly_plugintype + +`PluginAssembly pluginassembly_plugintype { get; set; }` + +N:1 pluginassembly_plugintype + +#### plugintype_sdkmessageprocessingstep + +`IEnumerable plugintype_sdkmessageprocessingstep { get; set; }` + +1:N plugintype_sdkmessageprocessingstep + +#### plugintypeid_sdkmessageprocessingstep + +`IEnumerable plugintypeid_sdkmessageprocessingstep { get; set; }` + +1:N plugintypeid_sdkmessageprocessingstep + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/Publisher.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/Publisher.md new file mode 100644 index 0000000..34f70ce --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/Publisher.md @@ -0,0 +1,429 @@ + + +# Publisher + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +A publisher of a CRM solution. + +## Members + +### Constructors + +#### Publisher() + +`Publisher()` + +Default Constructor. + + +### Properties + +#### Address1_AddressId + +`Nullable Address1_AddressId { get; set; }` + +Unique identifier for address 1. + +#### Address1_AddressTypeCode + +`Nullable Address1_AddressTypeCode { get; set; }` + +Type of address for address 1, such as billing, shipping, or primary address. + +#### Address1_City + +`string Address1_City { get; set; }` + +City name for address 1. + +#### Address1_Country + +`string Address1_Country { get; set; }` + +Country/region name for address 1. + +#### Address1_County + +`string Address1_County { get; set; }` + +County name for address 1. + +#### Address1_Fax + +`string Address1_Fax { get; set; }` + +Fax number for address 1. + +#### Address1_Latitude + +`Nullable Address1_Latitude { get; set; }` + +Latitude for address 1. + +#### Address1_Line1 + +`string Address1_Line1 { get; set; }` + +First line for entering address 1 information. + +#### Address1_Line2 + +`string Address1_Line2 { get; set; }` + +Second line for entering address 1 information. + +#### Address1_Line3 + +`string Address1_Line3 { get; set; }` + +Third line for entering address 1 information. + +#### Address1_Longitude + +`Nullable Address1_Longitude { get; set; }` + +Longitude for address 1. + +#### Address1_Name + +`string Address1_Name { get; set; }` + +Name to enter for address 1. + +#### Address1_PostOfficeBox + +`string Address1_PostOfficeBox { get; set; }` + +Post office box number for address 1. + +#### Address1_PostalCode + +`string Address1_PostalCode { get; set; }` + +ZIP Code or postal code for address 1. + +#### Address1_ShippingMethodCode + +`Nullable Address1_ShippingMethodCode { get; set; }` + +Method of shipment for address 1. + +#### Address1_StateOrProvince + +`string Address1_StateOrProvince { get; set; }` + +State or province for address 1. + +#### Address1_Telephone1 + +`string Address1_Telephone1 { get; set; }` + +First telephone number associated with address 1. + +#### Address1_Telephone2 + +`string Address1_Telephone2 { get; set; }` + +Second telephone number associated with address 1. + +#### Address1_Telephone3 + +`string Address1_Telephone3 { get; set; }` + +Third telephone number associated with address 1. + +#### Address1_UPSZone + +`string Address1_UPSZone { get; set; }` + +United Parcel Service (UPS) zone for address 1. + +#### Address1_UTCOffset + +`Nullable Address1_UTCOffset { get; set; }` + +UTC offset for address 1. This is the difference between local time and standard Coordinated Universal Time. + +#### Address2_AddressId + +`Nullable Address2_AddressId { get; set; }` + +Unique identifier for address 2. + +#### Address2_AddressTypeCode + +`Nullable Address2_AddressTypeCode { get; set; }` + +Type of address for address 2. such as billing, shipping, or primary address. + +#### Address2_City + +`string Address2_City { get; set; }` + +City name for address 2. + +#### Address2_Country + +`string Address2_Country { get; set; }` + +Country/region name for address 2. + +#### Address2_County + +`string Address2_County { get; set; }` + +County name for address 2. + +#### Address2_Fax + +`string Address2_Fax { get; set; }` + +Fax number for address 2. + +#### Address2_Latitude + +`Nullable Address2_Latitude { get; set; }` + +Latitude for address 2. + +#### Address2_Line1 + +`string Address2_Line1 { get; set; }` + +First line for entering address 2 information. + +#### Address2_Line2 + +`string Address2_Line2 { get; set; }` + +Second line for entering address 2 information. + +#### Address2_Line3 + +`string Address2_Line3 { get; set; }` + +Third line for entering address 2 information. + +#### Address2_Longitude + +`Nullable Address2_Longitude { get; set; }` + +Longitude for address 2. + +#### Address2_Name + +`string Address2_Name { get; set; }` + +Name to enter for address 2. + +#### Address2_PostOfficeBox + +`string Address2_PostOfficeBox { get; set; }` + +Post office box number for address 2. + +#### Address2_PostalCode + +`string Address2_PostalCode { get; set; }` + +ZIP Code or postal code for address 2. + +#### Address2_ShippingMethodCode + +`Nullable Address2_ShippingMethodCode { get; set; }` + +Method of shipment for address 2. + +#### Address2_StateOrProvince + +`string Address2_StateOrProvince { get; set; }` + +State or province for address 2. + +#### Address2_Telephone1 + +`string Address2_Telephone1 { get; set; }` + +First telephone number associated with address 2. + +#### Address2_Telephone2 + +`string Address2_Telephone2 { get; set; }` + +Second telephone number associated with address 2. + +#### Address2_Telephone3 + +`string Address2_Telephone3 { get; set; }` + +Third telephone number associated with address 2. + +#### Address2_UPSZone + +`string Address2_UPSZone { get; set; }` + +United Parcel Service (UPS) zone for address 2. + +#### Address2_UTCOffset + +`Nullable Address2_UTCOffset { get; set; }` + +UTC offset for address 2. This is the difference between local time and standard Coordinated Universal Time. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the publisher. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the publisher was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the publisher. + +#### CustomizationOptionValuePrefix + +`Nullable CustomizationOptionValuePrefix { get; set; }` + +Default option value prefix used for newly created options for solutions associated with this publisher. + +#### CustomizationPrefix + +`string CustomizationPrefix { get; set; }` + +Prefix used for new entities, attributes, and entity relationships for solutions associated with this publisher. + +#### Description + +`string Description { get; set; }` + +Description of the solution. + +#### EMailAddress + +`string EMailAddress { get; set; }` + +Email address for the publisher. + +#### EntityImage + +`byte[] EntityImage { get; set; }` + +Shows the default image for the record. + +#### EntityImageId + +`Nullable EntityImageId { get; }` + +For internal use only. + +#### FriendlyName + +`string FriendlyName { get; set; }` + +User display name for this publisher. + +#### IsReadonly + +`Nullable IsReadonly { get; }` + +Indicates whether the publisher was created as part of a managed solution installation. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the publisher. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the publisher was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who modified the publisher. + +#### OrganizationId + +`EntityReference OrganizationId { get; }` + +Unique identifier of the organization associated with the publisher. + +#### PinpointPublisherDefaultLocale + +`string PinpointPublisherDefaultLocale { get; }` + +Default locale of the publisher in Microsoft Pinpoint. + +#### PinpointPublisherId + +`Nullable PinpointPublisherId { get; }` + +Identifier of the publisher in Microsoft Pinpoint. + +#### PublisherId + +`Nullable PublisherId { get; set; }` + +Unique identifier of the publisher. + +#### SupportingWebsiteUrl + +`string SupportingWebsiteUrl { get; set; }` + +URL for the supporting website of this publisher. + +#### UniqueName + +`string UniqueName { get; set; }` + +The unique name of this publisher. + +#### lk_publisher_createdby + +`SystemUser lk_publisher_createdby { get; }` + +N:1 lk_publisher_createdby + +#### lk_publisher_modifiedby + +`SystemUser lk_publisher_modifiedby { get; }` + +N:1 lk_publisher_modifiedby + +#### lk_publisherbase_createdonbehalfby + +`SystemUser lk_publisherbase_createdonbehalfby { get; }` + +N:1 lk_publisherbase_createdonbehalfby + +#### lk_publisherbase_modifiedonbehalfby + +`SystemUser lk_publisherbase_modifiedonbehalfby { get; }` + +N:1 lk_publisherbase_modifiedonbehalfby + +#### publisher_solution + +`IEnumerable publisher_solution { get; set; }` + +1:N publisher_solution + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/Role.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/Role.md new file mode 100644 index 0000000..36ee2c1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/Role.md @@ -0,0 +1,273 @@ + + +# Role + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Grouping of security privileges. Users are assigned roles that authorize their access to the Microsoft CRM system. + +## Members + +### Constructors + +#### Role() + +`Role()` + +Default Constructor. + + +### Properties + +#### ApplicationId + +`Nullable ApplicationId { get; set; }` + +Application Id of user who created the role + +#### AppliesTo + +`string AppliesTo { get; set; }` + +Personas/Licenses the security role applies to + +#### BusinessUnitId + +`EntityReference BusinessUnitId { get; set; }` + +Unique identifier of the business unit with which the role is associated. + +#### CanBeDeleted + +`BooleanManagedProperty CanBeDeleted { get; set; }` + +Tells whether the role can be deleted. + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the role. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the role was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the role. + +#### Description + +`string Description { get; set; }` + +Description of the security role + +#### ImportSequenceNumber + +`Nullable ImportSequenceNumber { get; set; }` + +Unique identifier of the data import or data migration that created this record. + +#### IsAutoAssigned + +`Nullable IsAutoAssigned { get; set; }` + +Value indicating whether security role is auto-assigned based on user license + +#### IsCustomizable + +`BooleanManagedProperty IsCustomizable { get; set; }` + +Information that specifies whether this component can be customized. + +#### IsInherited + +`Nullable IsInherited { get; set; }` + +Role is inherited by users from team membership, if role associated with team. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Indicates whether the solution component is part of a managed solution. + +#### IsSystemGenerated + +`Nullable IsSystemGenerated { get; set; }` + +Is this role generated by the system + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the role. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the role was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who last modified the role. + +#### Name + +`string Name { get; set; }` + +Name of the role. + +#### OrganizationId + +`Nullable OrganizationId { get; }` + +Unique identifier of the organization associated with the role. + +#### OverriddenCreatedOn + +`Nullable OverriddenCreatedOn { get; set; }` + +Date and time that the record was migrated. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### ParentRoleId + +`EntityReference ParentRoleId { get; }` + +Unique identifier of the parent role. + +#### ParentRootRoleId + +`EntityReference ParentRootRoleId { get; }` + +Unique identifier of the parent root role. + +#### Referencedrole_parent_role + +`IEnumerable Referencedrole_parent_role { get; set; }` + +1:N role_parent_role + +#### Referencedrole_parent_root_role + +`IEnumerable Referencedrole_parent_root_role { get; set; }` + +1:N role_parent_root_role + +#### Referencingrole_parent_role + +`Role Referencingrole_parent_role { get; }` + +N:1 role_parent_role + +#### Referencingrole_parent_root_role + +`Role Referencingrole_parent_root_role { get; }` + +N:1 role_parent_root_role + +#### RoleId + +`Nullable RoleId { get; set; }` + +Unique identifier of the role. + +#### RoleIdUnique + +`Nullable RoleIdUnique { get; }` + +For internal use only. + +#### RoleTemplateId + +`EntityReference RoleTemplateId { get; }` + +Unique identifier of the role template that is associated with the role. + +#### Role_AsyncOperations + +`IEnumerable Role_AsyncOperations { get; set; }` + +1:N Role_AsyncOperations + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### SummaryofCoreTablePermissions + +`string SummaryofCoreTablePermissions { get; set; }` + +Summary of Core Table Permissions of the Role + +#### VersionNumber + +`Nullable VersionNumber { get; }` + +Version number of the role. + +#### lk_role_createdonbehalfby + +`SystemUser lk_role_createdonbehalfby { get; }` + +N:1 lk_role_createdonbehalfby + +#### lk_role_modifiedonbehalfby + +`SystemUser lk_role_modifiedonbehalfby { get; }` + +N:1 lk_role_modifiedonbehalfby + +#### lk_rolebase_createdby + +`SystemUser lk_rolebase_createdby { get; }` + +N:1 lk_rolebase_createdby + +#### lk_rolebase_modifiedby + +`SystemUser lk_rolebase_modifiedby { get; }` + +N:1 lk_rolebase_modifiedby + +#### solution_role + +`Solution solution_role { get; }` + +N:1 solution_role + +#### systemuserroles_association + +`IEnumerable systemuserroles_association { get; set; }` + +N:N systemuserroles_association + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SdkMessage.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SdkMessage.md new file mode 100644 index 0000000..ac8ceb6 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SdkMessage.md @@ -0,0 +1,237 @@ + + +# SdkMessage + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Message that is supported by the SDK. + +## Members + +### Constructors + +#### SdkMessage() + +`SdkMessage()` + +Default Constructor. + + +### Properties + +#### AutoTransact + +`Nullable AutoTransact { get; set; }` + +Information about whether the SDK message is automatically transacted. + +#### Availability + +`Nullable Availability { get; set; }` + +Identifies where a method will be exposed. 0 - Server, 1 - Client, 2 - both. + +#### CategoryName + +`string CategoryName { get; set; }` + +If this is a categorized method, this is the name, otherwise None. + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the SDK message. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the SDK message was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the sdkmessage. + +#### CustomizationLevel + +`Nullable CustomizationLevel { get; }` + +Customization level of the SDK message. + +#### ExecutePrivilegeName + +`string ExecutePrivilegeName { get; set; }` + +Name of the privilege that allows execution of the SDK message + +#### Expand + +`Nullable Expand { get; set; }` + +Indicates whether the SDK message should have its requests expanded per primary entity defined in its filters. + +#### IntroducedVersion + +`string IntroducedVersion { get; set; }` + +Version in which the component is introduced. + +#### IsActive + +`Nullable IsActive { get; set; }` + +Information about whether the SDK message is active. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Information that specifies whether this component is managed. + +#### IsPrivate + +`Nullable IsPrivate { get; set; }` + +Indicates whether the SDK message is private. + +#### IsReadOnly + +`Nullable IsReadOnly { get; set; }` + +Identifies whether an SDK message will be ReadOnly or Read Write. false - ReadWrite, true - ReadOnly . + +#### IsValidForExecuteAsync + +`Nullable IsValidForExecuteAsync { get; }` + +For internal use only. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the SDK message. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the SDK message was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who last modified the sdkmessage. + +#### Name + +`string Name { get; set; }` + +Name of the SDK message. + +#### OrganizationId + +`EntityReference OrganizationId { get; }` + +Unique identifier of the organization with which the SDK message is associated. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### SdkMessageId + +`Nullable SdkMessageId { get; set; }` + +Unique identifier of the SDK message entity. + +#### SdkMessageIdUnique + +`Nullable SdkMessageIdUnique { get; }` + +Unique identifier of the SDK message. + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### Template + +`Nullable Template { get; set; }` + +Indicates whether the SDK message is a template. + +#### ThrottleSettings + +`string ThrottleSettings { get; }` + +For internal use only. + +#### VersionNumber + +`Nullable VersionNumber { get; }` + +Number that identifies a specific revision of the SDK message. + +#### WorkflowSdkStepEnabled + +`Nullable WorkflowSdkStepEnabled { get; }` + +Whether or not the SDK message can be called from a workflow. + +#### createdby_sdkmessage + +`SystemUser createdby_sdkmessage { get; }` + +N:1 createdby_sdkmessage + +#### lk_sdkmessage_createdonbehalfby + +`SystemUser lk_sdkmessage_createdonbehalfby { get; }` + +N:1 lk_sdkmessage_createdonbehalfby + +#### lk_sdkmessage_modifiedonbehalfby + +`SystemUser lk_sdkmessage_modifiedonbehalfby { get; }` + +N:1 lk_sdkmessage_modifiedonbehalfby + +#### modifiedby_sdkmessage + +`SystemUser modifiedby_sdkmessage { get; }` + +N:1 modifiedby_sdkmessage + +#### sdkmessageid_sdkmessagefilter + +`IEnumerable sdkmessageid_sdkmessagefilter { get; set; }` + +1:N sdkmessageid_sdkmessagefilter + +#### sdkmessageid_sdkmessageprocessingstep + +`IEnumerable sdkmessageid_sdkmessageprocessingstep { get; set; }` + +1:N sdkmessageid_sdkmessageprocessingstep + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SdkMessageFilter.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SdkMessageFilter.md new file mode 100644 index 0000000..f2bc637 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SdkMessageFilter.md @@ -0,0 +1,207 @@ + + +# SdkMessageFilter + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Filter that defines which SDK messages are valid for each type of entity. + +## Members + +### Constructors + +#### SdkMessageFilter() + +`SdkMessageFilter()` + +Default Constructor. + + +### Properties + +#### Availability + +`Nullable Availability { get; set; }` + +Identifies where a method will be exposed. 0 - Server, 1 - Client, 2 - both. + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the SDK message filter. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the SDK message filter was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the sdkmessagefilter. + +#### CustomizationLevel + +`Nullable CustomizationLevel { get; }` + +Customization level of the SDK message filter. + +#### IntroducedVersion + +`string IntroducedVersion { get; set; }` + +Version in which the component is introduced. + +#### IsCustomProcessingStepAllowed + +`Nullable IsCustomProcessingStepAllowed { get; set; }` + +Indicates whether a custom SDK message processing step is allowed. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Information that specifies whether this component is managed. + +#### IsVisible + +`Nullable IsVisible { get; }` + +Indicates whether the filter should be visible. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the SDK message filter. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the SDK message filter was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who last modified the sdkmessagefilter. + +#### Name + +`string Name { get; set; }` + +Name of the SDK message filter. + +#### OrganizationId + +`EntityReference OrganizationId { get; }` + +Unique identifier of the organization with which the SDK message filter is associated. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### PrimaryObjectTypeCode + +`string PrimaryObjectTypeCode { get; }` + +Type of entity with which the SDK message filter is primarily associated. + +#### RestrictionLevel + +`Nullable RestrictionLevel { get; set; }` + +For internal use only. + +#### SdkMessageFilterId + +`Nullable SdkMessageFilterId { get; set; }` + +Unique identifier of the SDK message filter entity. + +#### SdkMessageFilterIdUnique + +`Nullable SdkMessageFilterIdUnique { get; }` + +Unique identifier of the SDK message filter. + +#### SdkMessageId + +`EntityReference SdkMessageId { get; set; }` + +Unique identifier of the related SDK message. + +#### SecondaryObjectTypeCode + +`string SecondaryObjectTypeCode { get; }` + +Type of entity with which the SDK message filter is secondarily associated. + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### WorkflowSdkStepEnabled + +`Nullable WorkflowSdkStepEnabled { get; }` + +Whether or not the SDK message can be called from a workflow. + +#### createdby_sdkmessagefilter + +`SystemUser createdby_sdkmessagefilter { get; }` + +N:1 createdby_sdkmessagefilter + +#### lk_sdkmessagefilter_createdonbehalfby + +`SystemUser lk_sdkmessagefilter_createdonbehalfby { get; }` + +N:1 lk_sdkmessagefilter_createdonbehalfby + +#### lk_sdkmessagefilter_modifiedonbehalfby + +`SystemUser lk_sdkmessagefilter_modifiedonbehalfby { get; }` + +N:1 lk_sdkmessagefilter_modifiedonbehalfby + +#### modifiedby_sdkmessagefilter + +`SystemUser modifiedby_sdkmessagefilter { get; }` + +N:1 modifiedby_sdkmessagefilter + +#### sdkmessagefilterid_sdkmessageprocessingstep + +`IEnumerable sdkmessagefilterid_sdkmessageprocessingstep { get; set; }` + +1:N sdkmessagefilterid_sdkmessageprocessingstep + +#### sdkmessageid_sdkmessagefilter + +`SdkMessage sdkmessageid_sdkmessagefilter { get; set; }` + +N:1 sdkmessageid_sdkmessagefilter + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SdkMessageProcessingStep.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SdkMessageProcessingStep.md new file mode 100644 index 0000000..06ce5f1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SdkMessageProcessingStep.md @@ -0,0 +1,351 @@ + + +# SdkMessageProcessingStep + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Stage in the execution pipeline that a plug-in is to execute. + +## Members + +### Constructors + +#### SdkMessageProcessingStep() + +`SdkMessageProcessingStep()` + +Default Constructor. + + +### Properties + +#### AsyncAutoDelete + +`Nullable AsyncAutoDelete { get; set; }` + +Indicates whether the asynchronous system job is automatically deleted on completion. + +#### CanUseReadOnlyConnection + +`Nullable CanUseReadOnlyConnection { get; set; }` + +Identifies whether a SDK Message Processing Step type will be ReadOnly or Read Write. false - ReadWrite, true - ReadOnly + +#### Category + +`string Category { get; set; }` + +For internal use only. + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### Configuration + +`string Configuration { get; set; }` + +Step-specific configuration for the plug-in type. Passed to the plug-in constructor at run time. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the SDK message processing step. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the SDK message processing step was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the sdkmessageprocessingstep. + +#### CustomizationLevel + +`Nullable CustomizationLevel { get; }` + +Customization level of the SDK message processing step. + +#### Description + +`string Description { get; set; }` + +Description of the SDK message processing step. + +#### EnablePluginProfiler + +`Nullable EnablePluginProfiler { get; set; }` + +EnablePluginProfiler + +#### EventExpander + +`string EventExpander { get; set; }` + +Configuration for sending pipeline events to the Event Expander service. + +#### EventHandler + +`EntityReference EventHandler { get; set; }` + +Unique identifier of the associated event handler. + +#### FilteringAttributes + +`string FilteringAttributes { get; set; }` + +Comma-separated list of attributes. If at least one of these attributes is modified, the plug-in should execute. + +#### FxExpressionId + +`EntityReference FxExpressionId { get; set; }` + +Unique identifier for fxexpression associated with SdkMessageProcessingStep. + +#### ImpersonatingUserId + +`EntityReference ImpersonatingUserId { get; set; }` + +Unique identifier of the user to impersonate context when step is executed. + +#### IntroducedVersion + +`string IntroducedVersion { get; set; }` + +Version in which the form is introduced. + +#### InvocationSource + +`Nullable InvocationSource { get; set; }` + +Identifies if a plug-in should be executed from a parent pipeline, a child pipeline, or both. + +#### IsCustomizable + +`BooleanManagedProperty IsCustomizable { get; set; }` + +Information that specifies whether this component can be customized. + +#### IsHidden + +`BooleanManagedProperty IsHidden { get; set; }` + +Information that specifies whether this component should be hidden. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Information that specifies whether this component is managed. + +#### Mode + +`Nullable Mode { get; set; }` + +Run-time mode of execution, for example, synchronous or asynchronous. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the SDK message processing step. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the SDK message processing step was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who last modified the sdkmessageprocessingstep. + +#### Name + +`string Name { get; set; }` + +Name of SdkMessage processing step. + +#### OrganizationId + +`EntityReference OrganizationId { get; }` + +Unique identifier of the organization with which the SDK message processing step is associated. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### PluginTypeId + +`EntityReference PluginTypeId { get; set; }` + +Unique identifier of the plug-in type associated with the step. + +#### PowerfxRuleId + +`EntityReference PowerfxRuleId { get; set; }` + +Unique identifier for powerfxrule associated with SdkMessageProcessingStep. + +#### Rank + +`Nullable Rank { get; set; }` + +Processing order within the stage. + +#### RuntimeIntegrationProperties + +`string RuntimeIntegrationProperties { get; set; }` + +For internal use only. Holds miscellaneous properties related to runtime integration. + +#### SdkMessageFilterId + +`EntityReference SdkMessageFilterId { get; set; }` + +Unique identifier of the SDK message filter. + +#### SdkMessageId + +`EntityReference SdkMessageId { get; set; }` + +Unique identifier of the SDK message. + +#### SdkMessageProcessingStepId + +`Nullable SdkMessageProcessingStepId { get; set; }` + +Unique identifier of the SDK message processing step entity. + +#### SdkMessageProcessingStepIdUnique + +`Nullable SdkMessageProcessingStepIdUnique { get; }` + +Unique identifier of the SDK message processing step. + +#### SdkMessageProcessingStepSecureConfigId + +`EntityReference SdkMessageProcessingStepSecureConfigId { get; set; }` + +Unique identifier of the Sdk message processing step secure configuration. + +#### SdkMessageProcessingStep_AsyncOperations + +`IEnumerable SdkMessageProcessingStep_AsyncOperations { get; set; }` + +1:N SdkMessageProcessingStep_AsyncOperations + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### Stage + +`Nullable Stage { get; set; }` + +Stage in the execution pipeline that the SDK message processing step is in. + +#### StateCode + +`Nullable StateCode { get; set; }` + +Status of the SDK message processing step. + +#### StatusCode + +`Nullable StatusCode { get; set; }` + +Reason for the status of the SDK message processing step. + +#### SupportedDeployment + +`Nullable SupportedDeployment { get; set; }` + +Deployment that the SDK message processing step should be executed on; server, client, or both. + +#### VersionNumber + +`Nullable VersionNumber { get; }` + +Number that identifies a specific revision of the SDK message processing step. + +#### createdby_sdkmessageprocessingstep + +`SystemUser createdby_sdkmessageprocessingstep { get; }` + +N:1 createdby_sdkmessageprocessingstep + +#### impersonatinguserid_sdkmessageprocessingstep + +`SystemUser impersonatinguserid_sdkmessageprocessingstep { get; set; }` + +N:1 impersonatinguserid_sdkmessageprocessingstep + +#### lk_sdkmessageprocessingstep_createdonbehalfby + +`SystemUser lk_sdkmessageprocessingstep_createdonbehalfby { get; }` + +N:1 lk_sdkmessageprocessingstep_createdonbehalfby + +#### lk_sdkmessageprocessingstep_modifiedonbehalfby + +`SystemUser lk_sdkmessageprocessingstep_modifiedonbehalfby { get; }` + +N:1 lk_sdkmessageprocessingstep_modifiedonbehalfby + +#### modifiedby_sdkmessageprocessingstep + +`SystemUser modifiedby_sdkmessageprocessingstep { get; }` + +N:1 modifiedby_sdkmessageprocessingstep + +#### plugintype_sdkmessageprocessingstep + +`PluginType plugintype_sdkmessageprocessingstep { get; set; }` + +N:1 plugintype_sdkmessageprocessingstep + +#### plugintypeid_sdkmessageprocessingstep + +`PluginType plugintypeid_sdkmessageprocessingstep { get; set; }` + +N:1 plugintypeid_sdkmessageprocessingstep + +#### sdkmessagefilterid_sdkmessageprocessingstep + +`SdkMessageFilter sdkmessagefilterid_sdkmessageprocessingstep { get; set; }` + +N:1 sdkmessagefilterid_sdkmessageprocessingstep + +#### sdkmessageid_sdkmessageprocessingstep + +`SdkMessage sdkmessageid_sdkmessageprocessingstep { get; set; }` + +N:1 sdkmessageid_sdkmessageprocessingstep + +#### sdkmessageprocessingstepid_sdkmessageprocessingstepimage + +`IEnumerable sdkmessageprocessingstepid_sdkmessageprocessingstepimage { get; set; }` + +1:N sdkmessageprocessingstepid_sdkmessageprocessingstepimage + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SdkMessageProcessingStepImage.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SdkMessageProcessingStepImage.md new file mode 100644 index 0000000..a415226 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SdkMessageProcessingStepImage.md @@ -0,0 +1,201 @@ + + +# SdkMessageProcessingStepImage + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Copy of an entity's attributes before or after the core system operation. + +## Members + +### Constructors + +#### SdkMessageProcessingStepImage() + +`SdkMessageProcessingStepImage()` + +Default Constructor. + + +### Properties + +#### Attributes1 + +`string Attributes1 { get; set; }` + +Comma-separated list of attributes that are to be passed into the SDK message processing step image. + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the SDK message processing step image. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the SDK message processing step image was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the sdkmessageprocessingstepimage. + +#### CustomizationLevel + +`Nullable CustomizationLevel { get; }` + +Customization level of the SDK message processing step image. + +#### Description + +`string Description { get; set; }` + +Description of the SDK message processing step image. + +#### EntityAlias + +`string EntityAlias { get; set; }` + +Key name used to access the pre-image or post-image property bags in a step. + +#### ImageType + +`Nullable ImageType { get; set; }` + +Type of image requested. + +#### IntroducedVersion + +`string IntroducedVersion { get; set; }` + +Version in which the form is introduced. + +#### IsCustomizable + +`BooleanManagedProperty IsCustomizable { get; set; }` + +Information that specifies whether this component can be customized. + +#### MessagePropertyName + +`string MessagePropertyName { get; set; }` + +Name of the property on the Request message. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the SDK message processing step. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the SDK message processing step was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who last modified the sdkmessageprocessingstepimage. + +#### Name + +`string Name { get; set; }` + +Name of SdkMessage processing step image. + +#### OrganizationId + +`EntityReference OrganizationId { get; }` + +Unique identifier of the organization with which the SDK message processing step is associated. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### RelatedAttributeName + +`string RelatedAttributeName { get; set; }` + +Name of the related entity. + +#### SdkMessageProcessingStepId + +`EntityReference SdkMessageProcessingStepId { get; set; }` + +Unique identifier of the SDK message processing step. + +#### SdkMessageProcessingStepImageId + +`Nullable SdkMessageProcessingStepImageId { get; set; }` + +Unique identifier of the SDK message processing step image entity. + +#### SdkMessageProcessingStepImageIdUnique + +`Nullable SdkMessageProcessingStepImageIdUnique { get; }` + +Unique identifier of the SDK message processing step image. + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### VersionNumber + +`Nullable VersionNumber { get; }` + +Number that identifies a specific revision of the step image. + +#### createdby_sdkmessageprocessingstepimage + +`SystemUser createdby_sdkmessageprocessingstepimage { get; }` + +N:1 createdby_sdkmessageprocessingstepimage + +#### lk_sdkmessageprocessingstepimage_createdonbehalfby + +`SystemUser lk_sdkmessageprocessingstepimage_createdonbehalfby { get; }` + +N:1 lk_sdkmessageprocessingstepimage_createdonbehalfby + +#### lk_sdkmessageprocessingstepimage_modifiedonbehalfby + +`SystemUser lk_sdkmessageprocessingstepimage_modifiedonbehalfby { get; }` + +N:1 lk_sdkmessageprocessingstepimage_modifiedonbehalfby + +#### modifiedby_sdkmessageprocessingstepimage + +`SystemUser modifiedby_sdkmessageprocessingstepimage { get; }` + +N:1 modifiedby_sdkmessageprocessingstepimage + +#### sdkmessageprocessingstepid_sdkmessageprocessingstepimage + +`SdkMessageProcessingStep sdkmessageprocessingstepid_sdkmessageprocessingstepimage { get; set; }` + +N:1 sdkmessageprocessingstepid_sdkmessageprocessingstepimage + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/ServiceEndpoint.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/ServiceEndpoint.md new file mode 100644 index 0000000..47e315e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/ServiceEndpoint.md @@ -0,0 +1,249 @@ + + +# ServiceEndpoint + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Service endpoint that can be contacted. + +## Members + +### Constructors + +#### ServiceEndpoint() + +`ServiceEndpoint()` + +Default Constructor. + + +### Properties + +#### AuthType + +`Nullable AuthType { get; set; }` + +Specifies mode of authentication with SB + +#### AuthValue + +`string AuthValue { get; set; }` + +Authentication Value + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### ConnectionMode + +`Nullable ConnectionMode { get; set; }` + +Connection mode to contact the service endpoint. + +#### Contract + +`Nullable Contract { get; set; }` + +Type of the endpoint contract. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the service endpoint. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the service endpoint was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the service endpoint. + +#### Description + +`string Description { get; set; }` + +Description of the service endpoint. + +#### IntroducedVersion + +`string IntroducedVersion { get; set; }` + +Version in which the form is introduced. + +#### IsCustomizable + +`BooleanManagedProperty IsCustomizable { get; set; }` + +Information that specifies whether this component can be customized. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Information that specifies whether this component is managed. + +#### KeyVaultReferenceId + +`EntityReference KeyVaultReferenceId { get; set; }` + +Unique identifier for keyvaultreference associated with serviceendpoint. + +#### ManagedIdentityId + +`EntityReference ManagedIdentityId { get; set; }` + +Unique identifier for managed identity associated with serviceendpoint. + +#### MessageCharset + +`Nullable MessageCharset { get; set; }` + +Specifies the character encoding for message content + +#### MessageFormat + +`Nullable MessageFormat { get; set; }` + +Content type of the message + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the service endpoint. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the service endpoint was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who modified the service endpoint. + +#### Name + +`string Name { get; set; }` + +Name of Service end point. + +#### NamespaceAddress + +`string NamespaceAddress { get; set; }` + +Full service endpoint address. + +#### NamespaceFormat + +`Nullable NamespaceFormat { get; set; }` + +Format of Service Bus Namespace + +#### OrganizationId + +`EntityReference OrganizationId { get; }` + +Unique identifier of the organization with which the service endpoint is associated. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### Path + +`string Path { get; set; }` + +Path to the service endpoint. + +#### RuntimeIntegrationProperties + +`string RuntimeIntegrationProperties { get; set; }` + +For internal use only. Holds miscellaneous properties related to runtime integration. + +#### SASKey + +`string SASKey { get; set; }` + +Shared Access Key + +#### SASKeyName + +`string SASKeyName { get; set; }` + +Shared Access Key Name + +#### SASToken + +`string SASToken { get; set; }` + +Shared Access Token + +#### SchemaType + +`Nullable SchemaType { get; set; }` + +Specifies schema type for event grid events + +#### ServiceEndpointId + +`Nullable ServiceEndpointId { get; set; }` + +Unique identifier of the service endpoint. + +#### ServiceEndpointIdUnique + +`Nullable ServiceEndpointIdUnique { get; }` + +Unique identifier of the service endpoint. + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### SolutionNamespace + +`string SolutionNamespace { get; set; }` + +Namespace of the App Fabric solution. + +#### Url + +`string Url { get; set; }` + +Full service endpoint Url. + +#### UseKeyVaultConfiguration + +`Nullable UseKeyVaultConfiguration { get; set; }` + +Use Auth Information in KeyVault + +#### UserClaim + +`Nullable UserClaim { get; set; }` + +Additional user claim value type. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/Solution.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/Solution.md new file mode 100644 index 0000000..307f970 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/Solution.md @@ -0,0 +1,261 @@ + + +# Solution + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +A solution which contains CRM customizations. + +## Members + +### Constructors + +#### Solution() + +`Solution()` + +Default Constructor. + + +### Properties + +#### ConfigurationPageId + +`EntityReference ConfigurationPageId { get; set; }` + +A link to an optional configuration page for this solution. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the solution. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the solution was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the solution. + +#### Description + +`string Description { get; set; }` + +Description of the solution. + +#### EnabledForSourceControlIntegration + +`Nullable EnabledForSourceControlIntegration { get; set; }` + +Indicates if solution is enabled for source control integration + +#### FriendlyName + +`string FriendlyName { get; set; }` + +User display name for the solution. + +#### InstalledOn + +`Nullable InstalledOn { get; }` + +Date and time when the solution was installed/upgraded. + +#### IsApiManaged + +`Nullable IsApiManaged { get; }` + +Information about whether the solution is api managed. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Indicates whether the solution is managed or unmanaged. + +#### IsVisible + +`Nullable IsVisible { get; }` + +Indicates whether the solution is visible outside of the platform. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the solution. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the solution was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who modified the solution. + +#### OrganizationId + +`EntityReference OrganizationId { get; }` + +Unique identifier of the organization associated with the solution. + +#### ParentSolutionId + +`EntityReference ParentSolutionId { get; }` + +Unique identifier of the parent solution. Should only be non-null if this solution is a patch. + +#### PinpointPublisherId + +`Nullable PinpointPublisherId { get; }` + +Identifier of the publisher of this solution in Microsoft Pinpoint. + +#### PinpointSolutionDefaultLocale + +`string PinpointSolutionDefaultLocale { get; }` + +Default locale of the solution in Microsoft Pinpoint. + +#### PinpointSolutionId + +`Nullable PinpointSolutionId { get; }` + +Identifier of the solution in Microsoft Pinpoint. + +#### PublisherId + +`EntityReference PublisherId { get; set; }` + +Unique identifier of the publisher. + +#### Referencedsolution_parent_solution + +`IEnumerable Referencedsolution_parent_solution { get; set; }` + +1:N solution_parent_solution + +#### Referencingsolution_parent_solution + +`Solution Referencingsolution_parent_solution { get; }` + +N:1 solution_parent_solution + +#### SolutionId + +`Nullable SolutionId { get; set; }` + +Unique identifier of the solution. + +#### SolutionPackageVersion + +`string SolutionPackageVersion { get; set; }` + +Solution package source organization version + +#### SolutionType + +`Nullable SolutionType { get; set; }` + +Solution Type + +#### SourceControlSyncStatus + +`Nullable SourceControlSyncStatus { get; set; }` + +Indicates the current status of source control integration + +#### TemplateSuffix + +`string TemplateSuffix { get; set; }` + +The template suffix of this solution + +#### Thumbprint + +`string Thumbprint { get; set; }` + +thumbprint of the solution signature + +#### UniqueName + +`string UniqueName { get; set; }` + +The unique name of this solution + +#### UpdatedOn + +`Nullable UpdatedOn { get; }` + +Date and time when the solution was updated. + +#### UpgradeInfo + +`string UpgradeInfo { get; }` + +Contains component info for the solution upgrade operation + +#### Version + +`string Version { get; set; }` + +Solution version, used to identify a solution for upgrades and hotfixes. + +#### lk_solution_createdby + +`SystemUser lk_solution_createdby { get; }` + +N:1 lk_solution_createdby + +#### lk_solution_modifiedby + +`SystemUser lk_solution_modifiedby { get; }` + +N:1 lk_solution_modifiedby + +#### lk_solutionbase_createdonbehalfby + +`SystemUser lk_solutionbase_createdonbehalfby { get; }` + +N:1 lk_solutionbase_createdonbehalfby + +#### lk_solutionbase_modifiedonbehalfby + +`SystemUser lk_solutionbase_modifiedonbehalfby { get; }` + +N:1 lk_solutionbase_modifiedonbehalfby + +#### publisher_solution + +`Publisher publisher_solution { get; set; }` + +N:1 publisher_solution + +#### solution_role + +`IEnumerable solution_role { get; set; }` + +1:N solution_role + +#### solution_solutioncomponent + +`IEnumerable solution_solutioncomponent { get; set; }` + +1:N solution_solutioncomponent + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SolutionComponent.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SolutionComponent.md new file mode 100644 index 0000000..4593af1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SolutionComponent.md @@ -0,0 +1,135 @@ + + +# SolutionComponent + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +A component of a CRM solution. + +## Members + +### Constructors + +#### SolutionComponent() + +`SolutionComponent()` + +Default Constructor. + + +### Properties + +#### ComponentType + +`Nullable ComponentType { get; }` + +The object type code of the component. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the solution + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the solution was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the solution. + +#### IsMetadata + +`Nullable IsMetadata { get; }` + +Indicates whether this component is metadata or data. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the solution. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the solution was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who modified the solution. + +#### ObjectId + +`Nullable ObjectId { get; }` + +Unique identifier of the object with which the component is associated. + +#### Referencedsolutioncomponent_parent_solutioncomponent + +`IEnumerable Referencedsolutioncomponent_parent_solutioncomponent { get; set; }` + +1:N solutioncomponent_parent_solutioncomponent + +#### Referencingsolutioncomponent_parent_solutioncomponent + +`SolutionComponent Referencingsolutioncomponent_parent_solutioncomponent { get; }` + +N:1 solutioncomponent_parent_solutioncomponent + +#### RootComponentBehavior + +`Nullable RootComponentBehavior { get; }` + +Indicates the include behavior of the root component. + +#### RootSolutionComponentId + +`Nullable RootSolutionComponentId { get; }` + +The parent ID of the subcomponent, which will be a root + +#### SolutionComponentId + +`Nullable SolutionComponentId { get; }` + +Unique identifier of the solution component. + +#### SolutionId + +`EntityReference SolutionId { get; }` + +Unique identifier of the solution. + +#### lk_solutioncomponentbase_createdonbehalfby + +`SystemUser lk_solutioncomponentbase_createdonbehalfby { get; }` + +N:1 lk_solutioncomponentbase_createdonbehalfby + +#### lk_solutioncomponentbase_modifiedonbehalfby + +`SystemUser lk_solutioncomponentbase_modifiedonbehalfby { get; }` + +N:1 lk_solutioncomponentbase_modifiedonbehalfby + +#### solution_solutioncomponent + +`Solution solution_solutioncomponent { get; }` + +N:1 solution_solutioncomponent + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SystemUser.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SystemUser.md new file mode 100644 index 0000000..b617f9b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/SystemUser.md @@ -0,0 +1,1311 @@ + + +# SystemUser + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Person with access to the Microsoft CRM system and who owns objects in the Microsoft CRM database. + +## Members + +### Constructors + +#### SystemUser() + +`SystemUser()` + +Default Constructor. + + +### Properties + +#### AccessMode + +`Nullable AccessMode { get; set; }` + +Type of user. + +#### Address1_AddressId + +`Nullable Address1_AddressId { get; set; }` + +Unique identifier for address 1. + +#### Address1_AddressTypeCode + +`Nullable Address1_AddressTypeCode { get; set; }` + +Type of address for address 1, such as billing, shipping, or primary address. + +#### Address1_City + +`string Address1_City { get; set; }` + +City name for address 1. + +#### Address1_Composite + +`string Address1_Composite { get; }` + +Shows the complete primary address. + +#### Address1_Country + +`string Address1_Country { get; set; }` + +Country/region name in address 1. + +#### Address1_County + +`string Address1_County { get; set; }` + +County name for address 1. + +#### Address1_Fax + +`string Address1_Fax { get; set; }` + +Fax number for address 1. + +#### Address1_Latitude + +`Nullable Address1_Latitude { get; set; }` + +Latitude for address 1. + +#### Address1_Line1 + +`string Address1_Line1 { get; set; }` + +First line for entering address 1 information. + +#### Address1_Line2 + +`string Address1_Line2 { get; set; }` + +Second line for entering address 1 information. + +#### Address1_Line3 + +`string Address1_Line3 { get; set; }` + +Third line for entering address 1 information. + +#### Address1_Longitude + +`Nullable Address1_Longitude { get; set; }` + +Longitude for address 1. + +#### Address1_Name + +`string Address1_Name { get; set; }` + +Name to enter for address 1. + +#### Address1_PostOfficeBox + +`string Address1_PostOfficeBox { get; set; }` + +Post office box number for address 1. + +#### Address1_PostalCode + +`string Address1_PostalCode { get; set; }` + +ZIP Code or postal code for address 1. + +#### Address1_ShippingMethodCode + +`Nullable Address1_ShippingMethodCode { get; set; }` + +Method of shipment for address 1. + +#### Address1_StateOrProvince + +`string Address1_StateOrProvince { get; set; }` + +State or province for address 1. + +#### Address1_Telephone1 + +`string Address1_Telephone1 { get; set; }` + +First telephone number associated with address 1. + +#### Address1_Telephone2 + +`string Address1_Telephone2 { get; set; }` + +Second telephone number associated with address 1. + +#### Address1_Telephone3 + +`string Address1_Telephone3 { get; set; }` + +Third telephone number associated with address 1. + +#### Address1_UPSZone + +`string Address1_UPSZone { get; set; }` + +United Parcel Service (UPS) zone for address 1. + +#### Address1_UTCOffset + +`Nullable Address1_UTCOffset { get; set; }` + +UTC offset for address 1. This is the difference between local time and standard Coordinated Universal Time. + +#### Address2_AddressId + +`Nullable Address2_AddressId { get; set; }` + +Unique identifier for address 2. + +#### Address2_AddressTypeCode + +`Nullable Address2_AddressTypeCode { get; set; }` + +Type of address for address 2, such as billing, shipping, or primary address. + +#### Address2_City + +`string Address2_City { get; set; }` + +City name for address 2. + +#### Address2_Composite + +`string Address2_Composite { get; }` + +Shows the complete secondary address. + +#### Address2_Country + +`string Address2_Country { get; set; }` + +Country/region name in address 2. + +#### Address2_County + +`string Address2_County { get; set; }` + +County name for address 2. + +#### Address2_Fax + +`string Address2_Fax { get; set; }` + +Fax number for address 2. + +#### Address2_Latitude + +`Nullable Address2_Latitude { get; set; }` + +Latitude for address 2. + +#### Address2_Line1 + +`string Address2_Line1 { get; set; }` + +First line for entering address 2 information. + +#### Address2_Line2 + +`string Address2_Line2 { get; set; }` + +Second line for entering address 2 information. + +#### Address2_Line3 + +`string Address2_Line3 { get; set; }` + +Third line for entering address 2 information. + +#### Address2_Longitude + +`Nullable Address2_Longitude { get; set; }` + +Longitude for address 2. + +#### Address2_Name + +`string Address2_Name { get; set; }` + +Name to enter for address 2. + +#### Address2_PostOfficeBox + +`string Address2_PostOfficeBox { get; set; }` + +Post office box number for address 2. + +#### Address2_PostalCode + +`string Address2_PostalCode { get; set; }` + +ZIP Code or postal code for address 2. + +#### Address2_ShippingMethodCode + +`Nullable Address2_ShippingMethodCode { get; set; }` + +Method of shipment for address 2. + +#### Address2_StateOrProvince + +`string Address2_StateOrProvince { get; set; }` + +State or province for address 2. + +#### Address2_Telephone1 + +`string Address2_Telephone1 { get; set; }` + +First telephone number associated with address 2. + +#### Address2_Telephone2 + +`string Address2_Telephone2 { get; set; }` + +Second telephone number associated with address 2. + +#### Address2_Telephone3 + +`string Address2_Telephone3 { get; set; }` + +Third telephone number associated with address 2. + +#### Address2_UPSZone + +`string Address2_UPSZone { get; set; }` + +United Parcel Service (UPS) zone for address 2. + +#### Address2_UTCOffset + +`Nullable Address2_UTCOffset { get; set; }` + +UTC offset for address 2. This is the difference between local time and standard Coordinated Universal Time. + +#### ApplicationId + +`Nullable ApplicationId { get; set; }` + +The identifier for the application. This is used to access data in another application. + +#### ApplicationIdUri + +`string ApplicationIdUri { get; }` + +The URI used as a unique logical identifier for the external app. This can be used to validate the application. + +#### AzureActiveDirectoryObjectId + +`Nullable AzureActiveDirectoryObjectId { get; }` + +This is the application directory object Id. + +#### AzureDeletedOn + +`Nullable AzureDeletedOn { get; }` + +Date and time when the user was set as soft deleted in Azure. + +#### AzureState + +`Nullable AzureState { get; set; }` + +Azure state of user + +#### BusinessUnitId + +`EntityReference BusinessUnitId { get; set; }` + +Unique identifier of the business unit with which the user is associated. + +#### CALType + +`Nullable CALType { get; set; }` + +License type of user. This is used only in the on-premises version of the product. Online licenses are managed through Microsoft 365 Office Portal + +#### CalendarId + +`EntityReference CalendarId { get; set; }` + +Fiscal calendar associated with the user. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the user. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the user was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the systemuser. + +#### DefaultFiltersPopulated + +`Nullable DefaultFiltersPopulated { get; }` + +Indicates if default outlook filters have been populated. + +#### DefaultMailbox + +`EntityReference DefaultMailbox { get; }` + +Select the mailbox associated with this user. + +#### DefaultOdbFolderName + +`string DefaultOdbFolderName { get; }` + +Type a default folder name for the user's OneDrive For Business location. + +#### DeletedState + +`Nullable DeletedState { get; }` + +User delete state + +#### DisabledReason + +`string DisabledReason { get; }` + +Reason for disabling the user. + +#### DisplayInServiceViews + +`Nullable DisplayInServiceViews { get; set; }` + +Whether to display the user in service views. + +#### DomainName + +`string DomainName { get; set; }` + +Active Directory domain of which the user is a member. + +#### EmailRouterAccessApproval + +`Nullable EmailRouterAccessApproval { get; set; }` + +Shows the status of the primary email address. + +#### EmployeeId + +`string EmployeeId { get; set; }` + +Employee identifier for the user. + +#### EntityImage + +`byte[] EntityImage { get; set; }` + +Shows the default image for the record. + +#### EntityImageId + +`Nullable EntityImageId { get; }` + +For internal use only. + +#### ExchangeRate + +`Nullable ExchangeRate { get; }` + +Exchange rate for the currency associated with the systemuser with respect to the base currency. + +#### FirstName + +`string FirstName { get; set; }` + +First name of the user. + +#### FullName + +`string FullName { get; }` + +Full name of the user. + +#### GovernmentId + +`string GovernmentId { get; set; }` + +Government identifier for the user. + +#### HomePhone + +`string HomePhone { get; set; }` + +Home phone number for the user. + +#### IdentityId + +`Nullable IdentityId { get; }` + +For internal use only. + +#### ImportSequenceNumber + +`Nullable ImportSequenceNumber { get; set; }` + +Unique identifier of the data import or data migration that created this record. + +#### IncomingEmailDeliveryMethod + +`Nullable IncomingEmailDeliveryMethod { get; set; }` + +Incoming email delivery method for the user. + +#### InternalEMailAddress + +`string InternalEMailAddress { get; set; }` + +Internal email address for the user. + +#### InviteStatusCode + +`Nullable InviteStatusCode { get; set; }` + +User invitation status. + +#### IsAllowedByIpFirewall + +`Nullable IsAllowedByIpFirewall { get; set; }` + +Bypasses the selected user from IP firewall restriction + +#### IsDisabled + +`Nullable IsDisabled { get; set; }` + +Information about whether the user is enabled. + +#### IsEmailAddressApprovedByO365Admin + +`Nullable IsEmailAddressApprovedByO365Admin { get; }` + +Shows the status of approval of the email address by O365 Admin. + +#### IsIntegrationUser + +`Nullable IsIntegrationUser { get; set; }` + +Check if user is an integration user. + +#### IsLicensed + +`Nullable IsLicensed { get; set; }` + +Information about whether the user is licensed. + +#### IsSyncWithDirectory + +`Nullable IsSyncWithDirectory { get; set; }` + +Information about whether the user is synced with the directory. + +#### JobTitle + +`string JobTitle { get; set; }` + +Job title of the user. + +#### LastName + +`string LastName { get; set; }` + +Last name of the user. + +#### MiddleName + +`string MiddleName { get; set; }` + +Middle name of the user. + +#### MobileAlertEMail + +`string MobileAlertEMail { get; set; }` + +Mobile alert email address for the user. + +#### MobileOfflineProfileId + +`EntityReference MobileOfflineProfileId { get; set; }` + +Items contained with a particular SystemUser. + +#### MobilePhone + +`string MobilePhone { get; set; }` + +Mobile phone number for the user. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the user. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the user was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who last modified the systemuser. + +#### NickName + +`string NickName { get; set; }` + +Nickname of the user. + +#### OrganizationId + +`Nullable OrganizationId { get; }` + +Unique identifier of the organization associated with the user. + +#### OutgoingEmailDeliveryMethod + +`Nullable OutgoingEmailDeliveryMethod { get; set; }` + +Outgoing email delivery method for the user. + +#### OverriddenCreatedOn + +`Nullable OverriddenCreatedOn { get; set; }` + +Date and time that the record was migrated. + +#### ParentSystemUserId + +`EntityReference ParentSystemUserId { get; set; }` + +Unique identifier of the manager of the user. + +#### PassportHi + +`Nullable PassportHi { get; set; }` + +For internal use only. + +#### PassportLo + +`Nullable PassportLo { get; set; }` + +For internal use only. + +#### PersonalEMailAddress + +`string PersonalEMailAddress { get; set; }` + +Personal email address of the user. + +#### PhotoUrl + +`string PhotoUrl { get; set; }` + +URL for the Website on which a photo of the user is located. + +#### PositionId + +`EntityReference PositionId { get; set; }` + +User's position in hierarchical security model. + +#### PreferredAddressCode + +`Nullable PreferredAddressCode { get; set; }` + +Preferred address for the user. + +#### PreferredEmailCode + +`Nullable PreferredEmailCode { get; set; }` + +Preferred email address for the user. + +#### PreferredPhoneCode + +`Nullable PreferredPhoneCode { get; set; }` + +Preferred phone number for the user. + +#### ProcessId + +`Nullable ProcessId { get; set; }` + +Shows the ID of the process. + +#### QueueId + +`EntityReference QueueId { get; set; }` + +Unique identifier of the default queue for the user. + +#### Referencedlk_systemuser_createdonbehalfby + +`IEnumerable Referencedlk_systemuser_createdonbehalfby { get; set; }` + +1:N lk_systemuser_createdonbehalfby + +#### Referencedlk_systemuser_modifiedonbehalfby + +`IEnumerable Referencedlk_systemuser_modifiedonbehalfby { get; set; }` + +1:N lk_systemuser_modifiedonbehalfby + +#### Referencedlk_systemuserbase_createdby + +`IEnumerable Referencedlk_systemuserbase_createdby { get; set; }` + +1:N lk_systemuserbase_createdby + +#### Referencedlk_systemuserbase_modifiedby + +`IEnumerable Referencedlk_systemuserbase_modifiedby { get; set; }` + +1:N lk_systemuserbase_modifiedby + +#### Referenceduser_parent_user + +`IEnumerable Referenceduser_parent_user { get; set; }` + +1:N user_parent_user + +#### Referencinglk_systemuser_createdonbehalfby + +`SystemUser Referencinglk_systemuser_createdonbehalfby { get; }` + +N:1 lk_systemuser_createdonbehalfby + +#### Referencinglk_systemuser_modifiedonbehalfby + +`SystemUser Referencinglk_systemuser_modifiedonbehalfby { get; }` + +N:1 lk_systemuser_modifiedonbehalfby + +#### Referencinglk_systemuserbase_createdby + +`SystemUser Referencinglk_systemuserbase_createdby { get; }` + +N:1 lk_systemuserbase_createdby + +#### Referencinglk_systemuserbase_modifiedby + +`SystemUser Referencinglk_systemuserbase_modifiedby { get; }` + +N:1 lk_systemuserbase_modifiedby + +#### Referencinguser_parent_user + +`SystemUser Referencinguser_parent_user { get; set; }` + +N:1 user_parent_user + +#### Salutation + +`string Salutation { get; set; }` + +Salutation for correspondence with the user. + +#### SetupUser + +`Nullable SetupUser { get; set; }` + +Check if user is a setup user. + +#### SharePointEmailAddress + +`string SharePointEmailAddress { get; set; }` + +SharePoint Work Email Address + +#### Skills + +`string Skills { get; set; }` + +Skill set of the user. + +#### StageId + +`Nullable StageId { get; set; }` + +Shows the ID of the stage. + +#### SystemManagedUserType + +`Nullable SystemManagedUserType { get; set; }` + +The type of user + +#### SystemUserId + +`Nullable SystemUserId { get; set; }` + +Unique identifier for the user. + +#### SystemUser_AsyncOperations + +`IEnumerable SystemUser_AsyncOperations { get; set; }` + +1:N SystemUser_AsyncOperations + +#### TerritoryId + +`EntityReference TerritoryId { get; set; }` + +Unique identifier of the territory to which the user is assigned. + +#### TimeZoneRuleVersionNumber + +`Nullable TimeZoneRuleVersionNumber { get; set; }` + +For internal use only. + +#### Title + +`string Title { get; set; }` + +Title of the user. + +#### TransactionCurrencyId + +`EntityReference TransactionCurrencyId { get; set; }` + +Unique identifier of the currency associated with the systemuser. + +#### TraversedPath + +`string TraversedPath { get; set; }` + +For internal use only. + +#### UTCConversionTimeZoneCode + +`Nullable UTCConversionTimeZoneCode { get; set; }` + +Time zone code that was in use when the record was created. + +#### UserLicenseType + +`Nullable UserLicenseType { get; set; }` + +Shows the type of user license. + +#### UserPuid + +`string UserPuid { get; }` + +User PUID User Identifiable Information + +#### VersionNumber + +`Nullable VersionNumber { get; }` + +Version number of the user. + +#### WindowsLiveID + +`string WindowsLiveID { get; set; }` + +Windows Live ID + +#### Workflow_licensee + +`IEnumerable Workflow_licensee { get; set; }` + +1:N Workflow_licensee + +#### YammerEmailAddress + +`string YammerEmailAddress { get; set; }` + +User's Yammer login email address + +#### YammerUserId + +`string YammerUserId { get; set; }` + +User's Yammer ID + +#### YomiFirstName + +`string YomiFirstName { get; set; }` + +Pronunciation of the first name of the user, written in phonetic hiragana or katakana characters. + +#### YomiFullName + +`string YomiFullName { get; }` + +Pronunciation of the full name of the user, written in phonetic hiragana or katakana characters. + +#### YomiLastName + +`string YomiLastName { get; set; }` + +Pronunciation of the last name of the user, written in phonetic hiragana or katakana characters. + +#### YomiMiddleName + +`string YomiMiddleName { get; set; }` + +Pronunciation of the middle name of the user, written in phonetic hiragana or katakana characters. + +#### createdby_pluginassembly + +`IEnumerable createdby_pluginassembly { get; set; }` + +1:N createdby_pluginassembly + +#### createdby_plugintype + +`IEnumerable createdby_plugintype { get; set; }` + +1:N createdby_plugintype + +#### createdby_sdkmessage + +`IEnumerable createdby_sdkmessage { get; set; }` + +1:N createdby_sdkmessage + +#### createdby_sdkmessagefilter + +`IEnumerable createdby_sdkmessagefilter { get; set; }` + +1:N createdby_sdkmessagefilter + +#### createdby_sdkmessageprocessingstep + +`IEnumerable createdby_sdkmessageprocessingstep { get; set; }` + +1:N createdby_sdkmessageprocessingstep + +#### createdby_sdkmessageprocessingstepimage + +`IEnumerable createdby_sdkmessageprocessingstepimage { get; set; }` + +1:N createdby_sdkmessageprocessingstepimage + +#### impersonatinguserid_sdkmessageprocessingstep + +`IEnumerable impersonatinguserid_sdkmessageprocessingstep { get; set; }` + +1:N impersonatinguserid_sdkmessageprocessingstep + +#### lk_asyncoperation_createdby + +`IEnumerable lk_asyncoperation_createdby { get; set; }` + +1:N lk_asyncoperation_createdby + +#### lk_asyncoperation_createdonbehalfby + +`IEnumerable lk_asyncoperation_createdonbehalfby { get; set; }` + +1:N lk_asyncoperation_createdonbehalfby + +#### lk_asyncoperation_modifiedby + +`IEnumerable lk_asyncoperation_modifiedby { get; set; }` + +1:N lk_asyncoperation_modifiedby + +#### lk_asyncoperation_modifiedonbehalfby + +`IEnumerable lk_asyncoperation_modifiedonbehalfby { get; set; }` + +1:N lk_asyncoperation_modifiedonbehalfby + +#### lk_connectionreference_createdby + +`IEnumerable lk_connectionreference_createdby { get; set; }` + +1:N lk_connectionreference_createdby + +#### lk_connectionreference_createdonbehalfby + +`IEnumerable lk_connectionreference_createdonbehalfby { get; set; }` + +1:N lk_connectionreference_createdonbehalfby + +#### lk_connectionreference_modifiedby + +`IEnumerable lk_connectionreference_modifiedby { get; set; }` + +1:N lk_connectionreference_modifiedby + +#### lk_connectionreference_modifiedonbehalfby + +`IEnumerable lk_connectionreference_modifiedonbehalfby { get; set; }` + +1:N lk_connectionreference_modifiedonbehalfby + +#### lk_environmentvariabledefinition_createdby + +`IEnumerable lk_environmentvariabledefinition_createdby { get; set; }` + +1:N lk_environmentvariabledefinition_createdby + +#### lk_environmentvariabledefinition_createdonbehalfby + +`IEnumerable lk_environmentvariabledefinition_createdonbehalfby { get; set; }` + +1:N lk_environmentvariabledefinition_createdonbehalfby + +#### lk_environmentvariabledefinition_modifiedby + +`IEnumerable lk_environmentvariabledefinition_modifiedby { get; set; }` + +1:N lk_environmentvariabledefinition_modifiedby + +#### lk_environmentvariabledefinition_modifiedonbehalfby + +`IEnumerable lk_environmentvariabledefinition_modifiedonbehalfby { get; set; }` + +1:N lk_environmentvariabledefinition_modifiedonbehalfby + +#### lk_environmentvariablevalue_createdby + +`IEnumerable lk_environmentvariablevalue_createdby { get; set; }` + +1:N lk_environmentvariablevalue_createdby + +#### lk_environmentvariablevalue_createdonbehalfby + +`IEnumerable lk_environmentvariablevalue_createdonbehalfby { get; set; }` + +1:N lk_environmentvariablevalue_createdonbehalfby + +#### lk_environmentvariablevalue_modifiedby + +`IEnumerable lk_environmentvariablevalue_modifiedby { get; set; }` + +1:N lk_environmentvariablevalue_modifiedby + +#### lk_environmentvariablevalue_modifiedonbehalfby + +`IEnumerable lk_environmentvariablevalue_modifiedonbehalfby { get; set; }` + +1:N lk_environmentvariablevalue_modifiedonbehalfby + +#### lk_importjobbase_createdby + +`IEnumerable lk_importjobbase_createdby { get; set; }` + +1:N lk_importjobbase_createdby + +#### lk_importjobbase_createdonbehalfby + +`IEnumerable lk_importjobbase_createdonbehalfby { get; set; }` + +1:N lk_importjobbase_createdonbehalfby + +#### lk_importjobbase_modifiedby + +`IEnumerable lk_importjobbase_modifiedby { get; set; }` + +1:N lk_importjobbase_modifiedby + +#### lk_importjobbase_modifiedonbehalfby + +`IEnumerable lk_importjobbase_modifiedonbehalfby { get; set; }` + +1:N lk_importjobbase_modifiedonbehalfby + +#### lk_pluginassembly_createdonbehalfby + +`IEnumerable lk_pluginassembly_createdonbehalfby { get; set; }` + +1:N lk_pluginassembly_createdonbehalfby + +#### lk_pluginassembly_modifiedonbehalfby + +`IEnumerable lk_pluginassembly_modifiedonbehalfby { get; set; }` + +1:N lk_pluginassembly_modifiedonbehalfby + +#### lk_pluginpackage_createdby + +`IEnumerable lk_pluginpackage_createdby { get; set; }` + +1:N lk_pluginpackage_createdby + +#### lk_pluginpackage_createdonbehalfby + +`IEnumerable lk_pluginpackage_createdonbehalfby { get; set; }` + +1:N lk_pluginpackage_createdonbehalfby + +#### lk_pluginpackage_modifiedby + +`IEnumerable lk_pluginpackage_modifiedby { get; set; }` + +1:N lk_pluginpackage_modifiedby + +#### lk_pluginpackage_modifiedonbehalfby + +`IEnumerable lk_pluginpackage_modifiedonbehalfby { get; set; }` + +1:N lk_pluginpackage_modifiedonbehalfby + +#### lk_plugintype_createdonbehalfby + +`IEnumerable lk_plugintype_createdonbehalfby { get; set; }` + +1:N lk_plugintype_createdonbehalfby + +#### lk_plugintype_modifiedonbehalfby + +`IEnumerable lk_plugintype_modifiedonbehalfby { get; set; }` + +1:N lk_plugintype_modifiedonbehalfby + +#### lk_publisher_createdby + +`IEnumerable lk_publisher_createdby { get; set; }` + +1:N lk_publisher_createdby + +#### lk_publisher_modifiedby + +`IEnumerable lk_publisher_modifiedby { get; set; }` + +1:N lk_publisher_modifiedby + +#### lk_publisherbase_createdonbehalfby + +`IEnumerable lk_publisherbase_createdonbehalfby { get; set; }` + +1:N lk_publisherbase_createdonbehalfby + +#### lk_publisherbase_modifiedonbehalfby + +`IEnumerable lk_publisherbase_modifiedonbehalfby { get; set; }` + +1:N lk_publisherbase_modifiedonbehalfby + +#### lk_role_createdonbehalfby + +`IEnumerable lk_role_createdonbehalfby { get; set; }` + +1:N lk_role_createdonbehalfby + +#### lk_role_modifiedonbehalfby + +`IEnumerable lk_role_modifiedonbehalfby { get; set; }` + +1:N lk_role_modifiedonbehalfby + +#### lk_rolebase_createdby + +`IEnumerable lk_rolebase_createdby { get; set; }` + +1:N lk_rolebase_createdby + +#### lk_rolebase_modifiedby + +`IEnumerable lk_rolebase_modifiedby { get; set; }` + +1:N lk_rolebase_modifiedby + +#### lk_sdkmessage_createdonbehalfby + +`IEnumerable lk_sdkmessage_createdonbehalfby { get; set; }` + +1:N lk_sdkmessage_createdonbehalfby + +#### lk_sdkmessage_modifiedonbehalfby + +`IEnumerable lk_sdkmessage_modifiedonbehalfby { get; set; }` + +1:N lk_sdkmessage_modifiedonbehalfby + +#### lk_sdkmessagefilter_createdonbehalfby + +`IEnumerable lk_sdkmessagefilter_createdonbehalfby { get; set; }` + +1:N lk_sdkmessagefilter_createdonbehalfby + +#### lk_sdkmessagefilter_modifiedonbehalfby + +`IEnumerable lk_sdkmessagefilter_modifiedonbehalfby { get; set; }` + +1:N lk_sdkmessagefilter_modifiedonbehalfby + +#### lk_sdkmessageprocessingstep_createdonbehalfby + +`IEnumerable lk_sdkmessageprocessingstep_createdonbehalfby { get; set; }` + +1:N lk_sdkmessageprocessingstep_createdonbehalfby + +#### lk_sdkmessageprocessingstep_modifiedonbehalfby + +`IEnumerable lk_sdkmessageprocessingstep_modifiedonbehalfby { get; set; }` + +1:N lk_sdkmessageprocessingstep_modifiedonbehalfby + +#### lk_sdkmessageprocessingstepimage_createdonbehalfby + +`IEnumerable lk_sdkmessageprocessingstepimage_createdonbehalfby { get; set; }` + +1:N lk_sdkmessageprocessingstepimage_createdonbehalfby + +#### lk_sdkmessageprocessingstepimage_modifiedonbehalfby + +`IEnumerable lk_sdkmessageprocessingstepimage_modifiedonbehalfby { get; set; }` + +1:N lk_sdkmessageprocessingstepimage_modifiedonbehalfby + +#### lk_solution_createdby + +`IEnumerable lk_solution_createdby { get; set; }` + +1:N lk_solution_createdby + +#### lk_solution_modifiedby + +`IEnumerable lk_solution_modifiedby { get; set; }` + +1:N lk_solution_modifiedby + +#### lk_solutionbase_createdonbehalfby + +`IEnumerable lk_solutionbase_createdonbehalfby { get; set; }` + +1:N lk_solutionbase_createdonbehalfby + +#### lk_solutionbase_modifiedonbehalfby + +`IEnumerable lk_solutionbase_modifiedonbehalfby { get; set; }` + +1:N lk_solutionbase_modifiedonbehalfby + +#### lk_solutioncomponentbase_createdonbehalfby + +`IEnumerable lk_solutioncomponentbase_createdonbehalfby { get; set; }` + +1:N lk_solutioncomponentbase_createdonbehalfby + +#### lk_solutioncomponentbase_modifiedonbehalfby + +`IEnumerable lk_solutioncomponentbase_modifiedonbehalfby { get; set; }` + +1:N lk_solutioncomponentbase_modifiedonbehalfby + +#### modifiedby_pluginassembly + +`IEnumerable modifiedby_pluginassembly { get; set; }` + +1:N modifiedby_pluginassembly + +#### modifiedby_plugintype + +`IEnumerable modifiedby_plugintype { get; set; }` + +1:N modifiedby_plugintype + +#### modifiedby_sdkmessage + +`IEnumerable modifiedby_sdkmessage { get; set; }` + +1:N modifiedby_sdkmessage + +#### modifiedby_sdkmessagefilter + +`IEnumerable modifiedby_sdkmessagefilter { get; set; }` + +1:N modifiedby_sdkmessagefilter + +#### modifiedby_sdkmessageprocessingstep + +`IEnumerable modifiedby_sdkmessageprocessingstep { get; set; }` + +1:N modifiedby_sdkmessageprocessingstep + +#### modifiedby_sdkmessageprocessingstepimage + +`IEnumerable modifiedby_sdkmessageprocessingstepimage { get; set; }` + +1:N modifiedby_sdkmessageprocessingstepimage + +#### system_user_asyncoperation + +`IEnumerable system_user_asyncoperation { get; set; }` + +1:N system_user_asyncoperation + +#### system_user_workflow + +`IEnumerable system_user_workflow { get; set; }` + +1:N system_user_workflow + +#### systemuserroles_association + +`IEnumerable systemuserroles_association { get; set; }` + +N:N systemuserroles_association + +#### user_connectionreference + +`IEnumerable user_connectionreference { get; set; }` + +1:N user_connectionreference + +#### user_environmentvariabledefinition + +`IEnumerable user_environmentvariabledefinition { get; set; }` + +1:N user_environmentvariabledefinition + +#### workflow_createdby + +`IEnumerable workflow_createdby { get; set; }` + +1:N workflow_createdby + +#### workflow_createdonbehalfby + +`IEnumerable workflow_createdonbehalfby { get; set; }` + +1:N workflow_createdonbehalfby + +#### workflow_modifiedby + +`IEnumerable workflow_modifiedby { get; set; }` + +1:N workflow_modifiedby + +#### workflow_modifiedonbehalfby + +`IEnumerable workflow_modifiedonbehalfby { get; set; }` + +1:N workflow_modifiedonbehalfby + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/WebResource.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/WebResource.md new file mode 100644 index 0000000..f631be3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/WebResource.md @@ -0,0 +1,111 @@ + + +# WebResource + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Data equivalent to files used in Web development. Web resources provide client-side components that are used to provide custom user interface elements. + +## Members + +### Constructors + +#### WebResource() + +`WebResource()` + +Default Constructor. + + +### Properties + +#### Content + +`string Content { get; set; }` + +Bytes of the web resource, in Base64 format. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the web resource. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the web resource was created. + +#### Description + +`string Description { get; set; }` + +Description of the web resource. + +#### DisplayName + +`string DisplayName { get; set; }` + +Display name of the web resource. + +#### IsCustomizable + +`BooleanManagedProperty IsCustomizable { get; set; }` + +Information that specifies whether this component can be customized. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Information that specifies whether this web resource is managed. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the web resource. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the web resource was last modified. + +#### Name + +`string Name { get; set; }` + +Name of the web resource. + +#### WebResourceId + +`Nullable WebResourceId { get; set; }` + +Unique identifier of the web resource. + +#### WebResourceType + +`OptionSetValue WebResourceType { get; set; }` + +Type of the web resource. + +#### lk_webresourcebase_createdby + +`SystemUser lk_webresourcebase_createdby { get; }` + +N:1 lk_webresourcebase_createdby + +#### lk_webresourcebase_modifiedby + +`SystemUser lk_webresourcebase_modifiedby { get; }` + +N:1 lk_webresourcebase_modifiedby + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/Workflow.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/Workflow.md new file mode 100644 index 0000000..2c9bfce --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/Workflow.md @@ -0,0 +1,615 @@ + + +# Workflow + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Entity` +- Implements: `INotifyPropertyChanged`, `INotifyPropertyChanging`, `IExtensibleDataObject` + +## Summary + +Set of logical rules that define the steps necessary to automate a specific business process, task, or set of actions to be performed. + +## Members + +### Constructors + +#### Workflow() + +`Workflow()` + +Default Constructor. + + +### Properties + +#### ActiveWorkflowId + +`EntityReference ActiveWorkflowId { get; }` + +Unique identifier of the latest activation record for the process. + +#### AsyncAutoDelete + +`Nullable AsyncAutoDelete { get; set; }` + +Indicates whether the asynchronous system job is automatically deleted on completion. + +#### BillingContext + +`string BillingContext { get; set; }` + +Billing context this flow is in. + +#### BusinessProcessType + +`Nullable BusinessProcessType { get; set; }` + +Business Process Type. + +#### Category + +`Nullable Category { get; set; }` + +Category of the process. + +#### Claims + +`string Claims { get; set; }` + +Claims related to this workflow. + +#### ClientData + +`string ClientData { get; set; }` + +Business logic converted into client data + +#### ClientDataIsCompressed + +`Nullable ClientDataIsCompressed { get; }` + +For Internal Use Only. + +#### ComponentState + +`Nullable ComponentState { get; }` + +For internal use only. + +#### ConnectionReferences + +`string ConnectionReferences { get; set; }` + +Connection References related to this workflow. + +#### CreateMetadata + +`string CreateMetadata { get; set; }` + +Create metadata for this workflow. + +#### CreateStage + +`Nullable CreateStage { get; set; }` + +Stage of the process when triggered on Create. + +#### CreatedBy + +`EntityReference CreatedBy { get; }` + +Unique identifier of the user who created the process. + +#### CreatedOn + +`Nullable CreatedOn { get; }` + +Date and time when the process was created. + +#### CreatedOnBehalfBy + +`EntityReference CreatedOnBehalfBy { get; }` + +Unique identifier of the delegate user who created the process. + +#### Credentials + +`string Credentials { get; set; }` + +Credentials related to this workflow. + +#### Definition + +`string Definition { get; set; }` + +Definition of the business logic of this workflow instance. + +#### DeleteStage + +`Nullable DeleteStage { get; set; }` + +Stage of the process when triggered on Delete. + +#### Dependencies + +`string Dependencies { get; set; }` + +Soft dependencies of this workflow instance. + +#### Description + +`string Description { get; set; }` + +Description of the process. + +#### DesktopFlowModules + +`string DesktopFlowModules { get; set; }` + +Desktop flow modules related to this workflow. + +#### DynamicsSolutionContext + +`string DynamicsSolutionContext { get; set; }` + +comma separated list of one or more Dynamics First Party Solution Unique names that this workflow is in context of. + +#### EntityImage + +`byte[] EntityImage { get; set; }` + +Shows the default image for the record. + +#### EntityImageId + +`Nullable EntityImageId { get; }` + +For internal use only. + +#### FormId + +`Nullable FormId { get; set; }` + +Unique identifier of the associated form. + +#### InputParameters + +`string InputParameters { get; set; }` + +Input parameters to the process. + +#### Inputs + +`string Inputs { get; set; }` + +Inputs definition for this workflow. + +#### IntroducedVersion + +`string IntroducedVersion { get; set; }` + +Version in which the form is introduced. + +#### IsCrmUIWorkflow + +`Nullable IsCrmUIWorkflow { get; }` + +Indicates whether the process was created using the Microsoft Dynamics 365 Web application. + +#### IsCustomProcessingStepAllowedForOtherPublishers + +`BooleanManagedProperty IsCustomProcessingStepAllowedForOtherPublishers { get; set; }` + +Defines whether other publishers can attach custom processing steps to this action + +#### IsCustomizable + +`BooleanManagedProperty IsCustomizable { get; set; }` + +Information that specifies whether this component can be customized. + +#### IsManaged + +`Nullable IsManaged { get; }` + +Indicates whether the solution component is part of a managed solution. + +#### IsTransacted + +`Nullable IsTransacted { get; set; }` + +Whether or not the steps in the process are executed in a single transaction. + +#### LanguageCode + +`Nullable LanguageCode { get; set; }` + +Language of the process. + +#### LicenseEntitledBy + +`EntityReference LicenseEntitledBy { get; set; }` + +The source of the license entitlements. + +#### Licensee + +`EntityReference Licensee { get; set; }` + +The user object that should be used to establish the license the flow should operate under. + +#### Metadata + +`string Metadata { get; set; }` + +Additional metadata for this workflow. + +#### Mode + +`Nullable Mode { get; set; }` + +Shows the mode of the process. + +#### ModernFlowType + +`Nullable ModernFlowType { get; set; }` + +Type of the Modern Flow. + +#### ModifiedBy + +`EntityReference ModifiedBy { get; }` + +Unique identifier of the user who last modified the process. + +#### ModifiedOn + +`Nullable ModifiedOn { get; }` + +Date and time when the process was last modified. + +#### ModifiedOnBehalfBy + +`EntityReference ModifiedOnBehalfBy { get; }` + +Unique identifier of the delegate user who last modified the process. + +#### ModifyMetadata + +`string ModifyMetadata { get; set; }` + +Flow modify metadata used for telemetry, etc. + +#### Name + +`string Name { get; set; }` + +Name of the process. + +#### OnDemand + +`Nullable OnDemand { get; set; }` + +Indicates whether the process is able to run as an on-demand process. + +#### Outputs + +`string Outputs { get; set; }` + +Outputs definition for this workflow. + +#### OverwriteTime + +`Nullable OverwriteTime { get; }` + +For internal use only. + +#### OwnerId + +`EntityReference OwnerId { get; set; }` + +Unique identifier of the user or team who owns the process. + +#### OwningBusinessUnit + +`EntityReference OwningBusinessUnit { get; }` + +Unique identifier of the business unit that owns the process. + +#### OwningTeam + +`EntityReference OwningTeam { get; }` + +Unique identifier of the team who owns the process. + +#### OwningUser + +`EntityReference OwningUser { get; }` + +Unique identifier of the user who owns the process. + +#### ParentWorkflowId + +`EntityReference ParentWorkflowId { get; }` + +Unique identifier of the definition for process activation. + +#### PlanVerified + +`Nullable PlanVerified { get; set; }` + +For Internal Use Only. + +#### PluginTypeId + +`EntityReference PluginTypeId { get; }` + +Unique identifier of the plug-in type. + +#### PrimaryEntity + +`string PrimaryEntity { get; set; }` + +Primary entity for the process. The process can be associated for one or more SDK operations defined on the primary entity. + +#### ProcessOrder + +`Nullable ProcessOrder { get; set; }` + +Type the business process flow order. + +#### ProcessRoleAssignment + +`string ProcessRoleAssignment { get; set; }` + +Contains the role assignment for the process. + +#### ProcessTriggerFormId + +`Nullable ProcessTriggerFormId { get; set; }` + +Unique identifier of the associated form for process trigger. + +#### ProcessTriggerScope + +`Nullable ProcessTriggerScope { get; set; }` + +Scope of the process trigger. + +#### Rank + +`Nullable Rank { get; set; }` + +Indicates the rank for order of execution for the synchronous workflow. + +#### ReferencedWorkflow_licenseentitledby + +`IEnumerable ReferencedWorkflow_licenseentitledby { get; set; }` + +1:N Workflow_licenseentitledby + +#### Referencedworkflow_active_workflow + +`IEnumerable Referencedworkflow_active_workflow { get; set; }` + +1:N workflow_active_workflow + +#### Referencedworkflow_parent_workflow + +`IEnumerable Referencedworkflow_parent_workflow { get; set; }` + +1:N workflow_parent_workflow + +#### ReferencingWorkflow_licenseentitledby + +`Workflow ReferencingWorkflow_licenseentitledby { get; set; }` + +N:1 Workflow_licenseentitledby + +#### Referencingworkflow_active_workflow + +`Workflow Referencingworkflow_active_workflow { get; }` + +N:1 workflow_active_workflow + +#### Referencingworkflow_parent_workflow + +`Workflow Referencingworkflow_parent_workflow { get; }` + +N:1 workflow_parent_workflow + +#### RendererObjectTypeCode + +`string RendererObjectTypeCode { get; set; }` + +The renderer type of Workflow + +#### ResourceContainer + +`string ResourceContainer { get; set; }` + +For internal use only. + +#### ResourceId + +`Nullable ResourceId { get; set; }` + +For internal use only. + +#### RunAs + +`Nullable RunAs { get; set; }` + +Specifies the system user account under which a workflow executes. + +#### SchemaVersion + +`string SchemaVersion { get; set; }` + +Schema version for this workflow. + +#### Scope + +`Nullable Scope { get; set; }` + +Scope of the process. + +#### SdkMessageId + +`EntityReference SdkMessageId { get; }` + +Unique identifier of the SDK Message associated with this workflow. + +#### SolutionId + +`Nullable SolutionId { get; }` + +Unique identifier of the associated solution. + +#### StateCode + +`Nullable StateCode { get; set; }` + +Status of the workflow + +#### StatusCode + +`Nullable StatusCode { get; set; }` + +Reason for the status of the workflow + +#### Subprocess + +`Nullable Subprocess { get; set; }` + +Indicates whether the process can be included in other processes as a child process. + +#### SyncWorkflowLogOnFailure + +`Nullable SyncWorkflowLogOnFailure { get; set; }` + +Select whether synchronous workflow failures will be saved to log files. + +#### ThrottlingBehavior + +`Nullable ThrottlingBehavior { get; set; }` + +The throttling behavior type. + +#### TriggerOnCreate + +`Nullable TriggerOnCreate { get; set; }` + +Indicates whether the process will be triggered when the primary entity is created. + +#### TriggerOnDelete + +`Nullable TriggerOnDelete { get; set; }` + +Indicates whether the process will be triggered on deletion of the primary entity. + +#### TriggerOnUpdateAttributeList + +`string TriggerOnUpdateAttributeList { get; set; }` + +Attributes that trigger the process when updated. + +#### TrustedAccess + +`Nullable TrustedAccess { get; }` + +For Internal Use Only. + +#### Type + +`Nullable Type { get; set; }` + +Type of the process. + +#### UIData + +`string UIData { get; }` + +For internal use only. + +#### UIFlowType + +`Nullable UIFlowType { get; set; }` + +Type of the UI Flow process. + +#### UniqueName + +`string UniqueName { get; set; }` + +Unique name of the process + +#### UpdateStage + +`Nullable UpdateStage { get; set; }` + +Select the stage a process will be triggered on update. + +#### WorkflowId + +`Nullable WorkflowId { get; set; }` + +Unique identifier of the process. + +#### WorkflowIdUnique + +`Nullable WorkflowIdUnique { get; }` + +For internal use only. + +#### Workflow_licensee + +`SystemUser Workflow_licensee { get; set; }` + +N:1 Workflow_licensee + +#### Xaml + +`string Xaml { get; set; }` + +XAML that defines the process. + +#### lk_asyncoperation_workflowactivationid + +`IEnumerable lk_asyncoperation_workflowactivationid { get; set; }` + +1:N lk_asyncoperation_workflowactivationid + +#### system_user_workflow + +`SystemUser system_user_workflow { get; }` + +N:1 system_user_workflow + +#### workflow_createdby + +`SystemUser workflow_createdby { get; }` + +N:1 workflow_createdby + +#### workflow_createdonbehalfby + +`SystemUser workflow_createdonbehalfby { get; }` + +N:1 workflow_createdonbehalfby + +#### workflow_modifiedby + +`SystemUser workflow_modifiedby { get; }` + +N:1 workflow_modifiedby + +#### workflow_modifiedonbehalfby + +`SystemUser workflow_modifiedonbehalfby { get; }` + +N:1 workflow_modifiedonbehalfby + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/asyncoperation_operationtype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/asyncoperation_operationtype.md new file mode 100644 index 0000000..18baaa7 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/asyncoperation_operationtype.md @@ -0,0 +1,12 @@ + + +# asyncoperation_operationtype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Type of the system job. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/asyncoperation_statecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/asyncoperation_statecode.md new file mode 100644 index 0000000..1c62eb8 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/asyncoperation_statecode.md @@ -0,0 +1,12 @@ + + +# asyncoperation_statecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Status of the system job. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/asyncoperation_statuscode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/asyncoperation_statuscode.md new file mode 100644 index 0000000..e8551cf --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/asyncoperation_statuscode.md @@ -0,0 +1,12 @@ + + +# asyncoperation_statuscode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Reason for the status of the system job. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/componentstate.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/componentstate.md new file mode 100644 index 0000000..88d1dd1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/componentstate.md @@ -0,0 +1,12 @@ + + +# componentstate + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +The state of this component. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/componenttype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/componenttype.md new file mode 100644 index 0000000..52e1422 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/componenttype.md @@ -0,0 +1,12 @@ + + +# componenttype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +All of the possible component types for solutions. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/connectionreference_promptingbehavior.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/connectionreference_promptingbehavior.md new file mode 100644 index 0000000..c9b310a --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/connectionreference_promptingbehavior.md @@ -0,0 +1,29 @@ + + +# connectionreference_promptingbehavior + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +This field configures how this connection reference gets prompted + +## Members + +### Fields + +#### Promptonimport + +`connectionreference_promptingbehavior Promptonimport` + +Prompt to provide a connection for this reference during import + +#### Skip + +`connectionreference_promptingbehavior Skip` + +Skip all prompting behavior. Used for Invoker based Connection References + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/connectionreference_statecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/connectionreference_statecode.md new file mode 100644 index 0000000..c1666a0 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/connectionreference_statecode.md @@ -0,0 +1,12 @@ + + +# connectionreference_statecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Status of the Connection Reference diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/connectionreference_statuscode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/connectionreference_statuscode.md new file mode 100644 index 0000000..63ad5b4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/connectionreference_statuscode.md @@ -0,0 +1,12 @@ + + +# connectionreference_statuscode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Reason for the status of the Connection Reference diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapi_allowedcustomprocessingsteptype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapi_allowedcustomprocessingsteptype.md new file mode 100644 index 0000000..27b9d57 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapi_allowedcustomprocessingsteptype.md @@ -0,0 +1,12 @@ + + +# customapi_allowedcustomprocessingsteptype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +The Allowed Custom Processing Step Type diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapi_statecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapi_statecode.md new file mode 100644 index 0000000..c4841a5 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapi_statecode.md @@ -0,0 +1,12 @@ + + +# customapi_statecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Status of the Custom API diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapi_statuscode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapi_statuscode.md new file mode 100644 index 0000000..93a5134 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapi_statuscode.md @@ -0,0 +1,12 @@ + + +# customapi_statuscode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Reason for the status of the Custom API diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapifieldtype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapifieldtype.md new file mode 100644 index 0000000..04d6f78 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapifieldtype.md @@ -0,0 +1,12 @@ + + +# customapifieldtype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Custom API Field Types diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapirequestparameter_statecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapirequestparameter_statecode.md new file mode 100644 index 0000000..b1ed224 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapirequestparameter_statecode.md @@ -0,0 +1,12 @@ + + +# customapirequestparameter_statecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Status of the Custom API Request Parameter diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapirequestparameter_statuscode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapirequestparameter_statuscode.md new file mode 100644 index 0000000..e795176 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapirequestparameter_statuscode.md @@ -0,0 +1,12 @@ + + +# customapirequestparameter_statuscode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Reason for the status of the Custom API Request Parameter diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapiresponseproperty_statecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapiresponseproperty_statecode.md new file mode 100644 index 0000000..be75f2f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapiresponseproperty_statecode.md @@ -0,0 +1,12 @@ + + +# customapiresponseproperty_statecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Status of the Custom API Response Property diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapiresponseproperty_statuscode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapiresponseproperty_statuscode.md new file mode 100644 index 0000000..59cba1a --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/customapiresponseproperty_statuscode.md @@ -0,0 +1,12 @@ + + +# customapiresponseproperty_statuscode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Reason for the status of the Custom API Response Property diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariabledefinition_secretstore.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariabledefinition_secretstore.md new file mode 100644 index 0000000..c8513dc --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariabledefinition_secretstore.md @@ -0,0 +1,12 @@ + + +# environmentvariabledefinition_secretstore + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +The secret store where the secret is persisted. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariabledefinition_statecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariabledefinition_statecode.md new file mode 100644 index 0000000..c664a32 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariabledefinition_statecode.md @@ -0,0 +1,12 @@ + + +# environmentvariabledefinition_statecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Status of the Environment Variable Definition diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariabledefinition_statuscode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariabledefinition_statuscode.md new file mode 100644 index 0000000..0b54db3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariabledefinition_statuscode.md @@ -0,0 +1,12 @@ + + +# environmentvariabledefinition_statuscode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Reason for the status of the Environment Variable Definition diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariablevalue_statecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariablevalue_statecode.md new file mode 100644 index 0000000..b381b7a --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariablevalue_statecode.md @@ -0,0 +1,12 @@ + + +# environmentvariablevalue_statecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Status of the Environment Variable Value diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariablevalue_statuscode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariablevalue_statuscode.md new file mode 100644 index 0000000..fcca430 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/environmentvariablevalue_statuscode.md @@ -0,0 +1,12 @@ + + +# environmentvariablevalue_statuscode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Reason for the status of the Environment Variable Value diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/isinherited.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/isinherited.md new file mode 100644 index 0000000..650441b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/isinherited.md @@ -0,0 +1,12 @@ + + +# isinherited + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +The role is inherited diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginassembly_authtype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginassembly_authtype.md new file mode 100644 index 0000000..4b9d250 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginassembly_authtype.md @@ -0,0 +1,12 @@ + + +# pluginassembly_authtype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Authentication Type for the Web sources like AzureWebApp, for example 0=BasicAuth diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginassembly_isolationmode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginassembly_isolationmode.md new file mode 100644 index 0000000..a389ba8 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginassembly_isolationmode.md @@ -0,0 +1,12 @@ + + +# pluginassembly_isolationmode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Information about how the plugin assembly is to be isolated at execution time; None / Sandboxed / External. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginassembly_sourcetype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginassembly_sourcetype.md new file mode 100644 index 0000000..40ec2d9 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginassembly_sourcetype.md @@ -0,0 +1,12 @@ + + +# pluginassembly_sourcetype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Location of the assembly, for example 0=database, 1=on-disk, 2=Normal, 3=AzureWebApp. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginpackage_statecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginpackage_statecode.md new file mode 100644 index 0000000..c7311c6 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginpackage_statecode.md @@ -0,0 +1,12 @@ + + +# pluginpackage_statecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Status of the Plugin Package diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginpackage_statuscode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginpackage_statuscode.md new file mode 100644 index 0000000..915b9d9 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/pluginpackage_statuscode.md @@ -0,0 +1,12 @@ + + +# pluginpackage_statuscode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Reason for the status of the Plugin Package diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/plugintracelog_mode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/plugintracelog_mode.md new file mode 100644 index 0000000..fed7ce9 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/plugintracelog_mode.md @@ -0,0 +1,12 @@ + + +# plugintracelog_mode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Type of Execution diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/plugintracelog_operationtype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/plugintracelog_operationtype.md new file mode 100644 index 0000000..5dfffc1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/plugintracelog_operationtype.md @@ -0,0 +1,12 @@ + + +# plugintracelog_operationtype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Type of Plugin diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/publisher_address1_addresstypecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/publisher_address1_addresstypecode.md new file mode 100644 index 0000000..fe0634e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/publisher_address1_addresstypecode.md @@ -0,0 +1,12 @@ + + +# publisher_address1_addresstypecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Type of address for address 1, such as billing, shipping, or primary address. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/publisher_address1_shippingmethodcode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/publisher_address1_shippingmethodcode.md new file mode 100644 index 0000000..35391e2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/publisher_address1_shippingmethodcode.md @@ -0,0 +1,12 @@ + + +# publisher_address1_shippingmethodcode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Method of shipment for address 1. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/publisher_address2_addresstypecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/publisher_address2_addresstypecode.md new file mode 100644 index 0000000..588dd7b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/publisher_address2_addresstypecode.md @@ -0,0 +1,12 @@ + + +# publisher_address2_addresstypecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Type of address for address 2. such as billing, shipping, or primary address. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/publisher_address2_shippingmethodcode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/publisher_address2_shippingmethodcode.md new file mode 100644 index 0000000..4da87b4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/publisher_address2_shippingmethodcode.md @@ -0,0 +1,12 @@ + + +# publisher_address2_shippingmethodcode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Method of shipment for address 2. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_invocationsource.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_invocationsource.md new file mode 100644 index 0000000..c345272 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_invocationsource.md @@ -0,0 +1,12 @@ + + +# sdkmessageprocessingstep_invocationsource + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Identifies if a plug-in should be executed from a parent pipeline, a child pipeline, or both. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_mode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_mode.md new file mode 100644 index 0000000..e45eb31 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_mode.md @@ -0,0 +1,12 @@ + + +# sdkmessageprocessingstep_mode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Run-time mode of execution, for example, synchronous or asynchronous. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_stage.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_stage.md new file mode 100644 index 0000000..aaa1947 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_stage.md @@ -0,0 +1,12 @@ + + +# sdkmessageprocessingstep_stage + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Stage in the execution pipeline that the SDK message processing step is in. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_statecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_statecode.md new file mode 100644 index 0000000..0584b23 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_statecode.md @@ -0,0 +1,12 @@ + + +# sdkmessageprocessingstep_statecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Status of the SDK message processing step. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_statuscode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_statuscode.md new file mode 100644 index 0000000..3c228b4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_statuscode.md @@ -0,0 +1,12 @@ + + +# sdkmessageprocessingstep_statuscode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Reason for the status of the SDK message processing step. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_supporteddeployment.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_supporteddeployment.md new file mode 100644 index 0000000..5d3afbb --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstep_supporteddeployment.md @@ -0,0 +1,12 @@ + + +# sdkmessageprocessingstep_supporteddeployment + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Deployment that the SDK message processing step should be executed on; server, client, or both. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstepimage_imagetype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstepimage_imagetype.md new file mode 100644 index 0000000..0d97948 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/sdkmessageprocessingstepimage_imagetype.md @@ -0,0 +1,12 @@ + + +# sdkmessageprocessingstepimage_imagetype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Type of image requested. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/securityrole_isautoassigned.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/securityrole_isautoassigned.md new file mode 100644 index 0000000..dacb6e2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/securityrole_isautoassigned.md @@ -0,0 +1,12 @@ + + +# securityrole_isautoassigned + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Value indicating whether security role is auto-assigned based on user license diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_authtype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_authtype.md new file mode 100644 index 0000000..32f099b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_authtype.md @@ -0,0 +1,12 @@ + + +# serviceendpoint_authtype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Authentication type for Service Bus diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_connectionmode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_connectionmode.md new file mode 100644 index 0000000..eda9019 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_connectionmode.md @@ -0,0 +1,12 @@ + + +# serviceendpoint_connectionmode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Connection mode. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_contract.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_contract.md new file mode 100644 index 0000000..9b399a2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_contract.md @@ -0,0 +1,12 @@ + + +# serviceendpoint_contract + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Contract type. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_messagecharset.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_messagecharset.md new file mode 100644 index 0000000..e383203 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_messagecharset.md @@ -0,0 +1,12 @@ + + +# serviceendpoint_messagecharset + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Character encoding used for messages sent to a service endpoint diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_messageformat.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_messageformat.md new file mode 100644 index 0000000..48ea3e0 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_messageformat.md @@ -0,0 +1,12 @@ + + +# serviceendpoint_messageformat + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Format type. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_namespaceformat.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_namespaceformat.md new file mode 100644 index 0000000..64847ff --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_namespaceformat.md @@ -0,0 +1,12 @@ + + +# serviceendpoint_namespaceformat + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Format for Service Bus Namespace diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_schematype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_schematype.md new file mode 100644 index 0000000..8732c44 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_schematype.md @@ -0,0 +1,12 @@ + + +# serviceendpoint_schematype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Schema type for Event Grid diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_userclaim.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_userclaim.md new file mode 100644 index 0000000..58bb56f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/serviceendpoint_userclaim.md @@ -0,0 +1,12 @@ + + +# serviceendpoint_userclaim + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +User claim value type. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/solution_solutiontype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/solution_solutiontype.md new file mode 100644 index 0000000..eec9064 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/solution_solutiontype.md @@ -0,0 +1,12 @@ + + +# solution_solutiontype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +All possible types of solution diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/solutioncomponent_rootcomponentbehavior.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/solutioncomponent_rootcomponentbehavior.md new file mode 100644 index 0000000..7b5a46b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/solutioncomponent_rootcomponentbehavior.md @@ -0,0 +1,12 @@ + + +# solutioncomponent_rootcomponentbehavior + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Indicates the include behavior of the root component. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_accessmode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_accessmode.md new file mode 100644 index 0000000..ac2c460 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_accessmode.md @@ -0,0 +1,12 @@ + + +# systemuser_accessmode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Type of user. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_address1_addresstypecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_address1_addresstypecode.md new file mode 100644 index 0000000..29273b4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_address1_addresstypecode.md @@ -0,0 +1,12 @@ + + +# systemuser_address1_addresstypecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Type of address for address 1, such as billing, shipping, or primary address. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_address1_shippingmethodcode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_address1_shippingmethodcode.md new file mode 100644 index 0000000..0a6de91 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_address1_shippingmethodcode.md @@ -0,0 +1,12 @@ + + +# systemuser_address1_shippingmethodcode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Method of shipment for address 1. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_address2_addresstypecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_address2_addresstypecode.md new file mode 100644 index 0000000..b70d39c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_address2_addresstypecode.md @@ -0,0 +1,12 @@ + + +# systemuser_address2_addresstypecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Type of address for address 2, such as billing, shipping, or primary address. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_address2_shippingmethodcode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_address2_shippingmethodcode.md new file mode 100644 index 0000000..2d88f4f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_address2_shippingmethodcode.md @@ -0,0 +1,12 @@ + + +# systemuser_address2_shippingmethodcode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Method of shipment for address 2. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_azurestate.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_azurestate.md new file mode 100644 index 0000000..ec2a4b6 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_azurestate.md @@ -0,0 +1,12 @@ + + +# systemuser_azurestate + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Azure state of user. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_caltype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_caltype.md new file mode 100644 index 0000000..130e1e8 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_caltype.md @@ -0,0 +1,12 @@ + + +# systemuser_caltype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +License type of user. This is used only in the on-premises version of the product. Online licenses are managed through Microsoft 365 Office Portal. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_deletestate.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_deletestate.md new file mode 100644 index 0000000..3dacf60 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_deletestate.md @@ -0,0 +1,12 @@ + + +# systemuser_deletestate + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +User delete state. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_emailrouteraccessapproval.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_emailrouteraccessapproval.md new file mode 100644 index 0000000..464002e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_emailrouteraccessapproval.md @@ -0,0 +1,12 @@ + + +# systemuser_emailrouteraccessapproval + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Indicates the approval options for server-side synchronization or Email Router access. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_incomingemaildeliverymethod.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_incomingemaildeliverymethod.md new file mode 100644 index 0000000..8b69c94 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_incomingemaildeliverymethod.md @@ -0,0 +1,12 @@ + + +# systemuser_incomingemaildeliverymethod + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Incoming email delivery method for the user. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_invitestatuscode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_invitestatuscode.md new file mode 100644 index 0000000..7a0fe0d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_invitestatuscode.md @@ -0,0 +1,12 @@ + + +# systemuser_invitestatuscode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +User invitation status. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_outgoingemaildeliverymethod.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_outgoingemaildeliverymethod.md new file mode 100644 index 0000000..06f9e08 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_outgoingemaildeliverymethod.md @@ -0,0 +1,12 @@ + + +# systemuser_outgoingemaildeliverymethod + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Outgoing email delivery method for the user. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_preferredaddresscode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_preferredaddresscode.md new file mode 100644 index 0000000..6681040 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_preferredaddresscode.md @@ -0,0 +1,12 @@ + + +# systemuser_preferredaddresscode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Preferred address for the user. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_preferredemailcode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_preferredemailcode.md new file mode 100644 index 0000000..17ecd89 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_preferredemailcode.md @@ -0,0 +1,12 @@ + + +# systemuser_preferredemailcode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Preferred email address for the user. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_preferredphonecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_preferredphonecode.md new file mode 100644 index 0000000..b73c0d2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_preferredphonecode.md @@ -0,0 +1,12 @@ + + +# systemuser_preferredphonecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Preferred phone number for the user. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_systemmanagedusertype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_systemmanagedusertype.md new file mode 100644 index 0000000..c7244bf --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/systemuser_systemmanagedusertype.md @@ -0,0 +1,12 @@ + + +# systemuser_systemmanagedusertype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +The type of user diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_businessprocesstype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_businessprocesstype.md new file mode 100644 index 0000000..2f075e2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_businessprocesstype.md @@ -0,0 +1,12 @@ + + +# workflow_businessprocesstype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Business Process Type. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_category.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_category.md new file mode 100644 index 0000000..ab6af81 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_category.md @@ -0,0 +1,12 @@ + + +# workflow_category + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Category of the process. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_mode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_mode.md new file mode 100644 index 0000000..01d11d1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_mode.md @@ -0,0 +1,12 @@ + + +# workflow_mode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Mode of the process. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_modernflowtype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_modernflowtype.md new file mode 100644 index 0000000..28535a7 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_modernflowtype.md @@ -0,0 +1,12 @@ + + +# workflow_modernflowtype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Type of the Modern Flow process. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_runas.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_runas.md new file mode 100644 index 0000000..470645c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_runas.md @@ -0,0 +1,12 @@ + + +# workflow_runas + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Specifies the system user account under which a workflow executes diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_scope.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_scope.md new file mode 100644 index 0000000..dd4906c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_scope.md @@ -0,0 +1,12 @@ + + +# workflow_scope + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Workflow scope. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_stage.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_stage.md new file mode 100644 index 0000000..4ac96f8 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_stage.md @@ -0,0 +1,12 @@ + + +# workflow_stage + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Stage in which the Workflow executes diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_statecode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_statecode.md new file mode 100644 index 0000000..ba4870a --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_statecode.md @@ -0,0 +1,12 @@ + + +# workflow_statecode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Status of the workflow diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_statuscode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_statuscode.md new file mode 100644 index 0000000..91f2e24 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_statuscode.md @@ -0,0 +1,12 @@ + + +# workflow_statuscode + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Reason for the status of the workflow diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_throttlingbehaviortype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_throttlingbehaviortype.md new file mode 100644 index 0000000..5a948ec --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_throttlingbehaviortype.md @@ -0,0 +1,12 @@ + + +# workflow_throttlingbehaviortype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Type of workflow throttling behavior. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_type.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_type.md new file mode 100644 index 0000000..b200d94 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_type.md @@ -0,0 +1,12 @@ + + +# workflow_type + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Workflow type. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_uiflowtype.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_uiflowtype.md new file mode 100644 index 0000000..c49b2cd --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Generated/workflow_uiflowtype.md @@ -0,0 +1,12 @@ + + +# workflow_uiflowtype + +- Namespace: `PPDS.Dataverse.Generated` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Type of the UI Flow process. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/AddOptionValueRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/AddOptionValueRequest.md new file mode 100644 index 0000000..143fa2d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/AddOptionValueRequest.md @@ -0,0 +1,64 @@ + + +# AddOptionValueRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to add a new option value to an existing option set. + +## Members + +### Properties + +#### AttributeLogicalName + +`string AttributeLogicalName { get; set; }` + +Gets or sets the attribute logical name (for local option sets). + +#### Color + +`string Color { get; set; }` + +Gets or sets the color associated with the option (hex string). + +#### Description + +`string Description { get; set; }` + +Gets or sets the description for the new option. + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the entity logical name (for local option sets). + +#### Label + +`string Label { get; set; }` + +Gets or sets the label for the new option. + +#### OptionSetName + +`string OptionSetName { get; set; }` + +Gets or sets the name of the option set. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the option set. + +#### Value + +`Nullable Value { get; set; }` + +Gets or sets the numeric value for the new option. Auto-assigned if null. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CascadeBehavior.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CascadeBehavior.md new file mode 100644 index 0000000..fe99f79 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CascadeBehavior.md @@ -0,0 +1,53 @@ + + +# CascadeBehavior + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Defines the cascade behavior options for entity relationship actions. + +## Members + +### Fields + +#### Active + +`CascadeBehavior Active` + +Cascade the action to all active related records. + +#### Cascade + +`CascadeBehavior Cascade` + +Cascade the action to all related records. + +#### NoCascade + +`CascadeBehavior NoCascade` + +Do not cascade the action. + +#### RemoveLink + +`CascadeBehavior RemoveLink` + +Remove the link to related records. + +#### Restrict + +`CascadeBehavior Restrict` + +Restrict the action if related records exist. + +#### UserOwned + +`CascadeBehavior UserOwned` + +Cascade the action to all records owned by the same user. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CascadeConfigurationDto.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CascadeConfigurationDto.md new file mode 100644 index 0000000..b483260 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CascadeConfigurationDto.md @@ -0,0 +1,52 @@ + + +# CascadeConfigurationDto + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Defines the cascade behavior configuration for a relationship. + +## Members + +### Properties + +#### Assign + +`Nullable Assign { get; set; }` + +Gets or sets the cascade behavior for assign operations. + +#### Delete + +`Nullable Delete { get; set; }` + +Gets or sets the cascade behavior for delete operations. + +#### Merge + +`Nullable Merge { get; set; }` + +Gets or sets the cascade behavior for merge operations. + +#### Reparent + +`Nullable Reparent { get; set; }` + +Gets or sets the cascade behavior for reparent operations. + +#### Share + +`Nullable Share { get; set; }` + +Gets or sets the cascade behavior for share operations. + +#### Unshare + +`Nullable Unshare { get; set; }` + +Gets or sets the cascade behavior for unshare operations. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateChoiceResult.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateChoiceResult.md new file mode 100644 index 0000000..285844e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateChoiceResult.md @@ -0,0 +1,40 @@ + + +# CreateChoiceResult + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Result of a create global choice operation. + +## Members + +### Properties + +#### MetadataId + +`Guid MetadataId { get; set; }` + +Gets or sets the metadata identifier of the created global choice. + +#### Name + +`string Name { get; set; }` + +Gets or sets the name of the created global choice. + +#### ValidationMessages + +`ValidationMessage[] ValidationMessages { get; set; }` + +Gets or sets the validation messages produced during the operation. + +#### WasDryRun + +`bool WasDryRun { get; set; }` + +Gets or sets whether the operation was a dry run. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateColumnRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateColumnRequest.md new file mode 100644 index 0000000..2cd0114 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateColumnRequest.md @@ -0,0 +1,172 @@ + + +# CreateColumnRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to create a new column (attribute) on a Dataverse table. + +## Members + +### Properties + +#### AutoNumberFormat + +`string AutoNumberFormat { get; set; }` + +Gets or sets the auto-number format string for auto-number columns (String type). + +#### CanStoreFullImage + +`Nullable CanStoreFullImage { get; set; }` + +Gets or sets whether the Image column can store the full-size image. + +#### ColumnType + +`SchemaColumnType ColumnType { get; set; }` + +Gets or sets the column type. + +#### DateTimeBehavior + +`string DateTimeBehavior { get; set; }` + +Gets or sets the date/time behavior. Valid values: "UserLocal", "DateOnly", "TimeZoneIndependent". + +#### DefaultValue + +`Nullable DefaultValue { get; set; }` + +Gets or sets the default value for Choice or Boolean columns. + +#### Description + +`string Description { get; set; }` + +Gets or sets the description of the column. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the display name of the column. + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the logical name of the entity to add the column to. + +#### FalseLabel + +`string FalseLabel { get; set; }` + +Gets or sets the label for the false value of a Boolean column. + +#### Format + +`string Format { get; set; }` + +Gets or sets the format for String, Integer, or DateTime columns. + +#### ImeMode + +`string ImeMode { get; set; }` + +Gets or sets the IME mode for Money columns. + +#### IsAuditEnabled + +`Nullable IsAuditEnabled { get; set; }` + +Gets or sets whether auditing is enabled for the column. + +#### IsSecured + +`Nullable IsSecured { get; set; }` + +Gets or sets whether the column is secured (field-level security). + +#### IsValidForAdvancedFind + +`Nullable IsValidForAdvancedFind { get; set; }` + +Gets or sets whether the column is valid for Advanced Find. + +#### MaxLength + +`Nullable MaxLength { get; set; }` + +Gets or sets the maximum length for String/Memo columns. + +#### MaxSizeInKB + +`Nullable MaxSizeInKB { get; set; }` + +Gets or sets the maximum file size in KB for Image/File columns. + +#### MaxValue + +`Nullable MaxValue { get; set; }` + +Gets or sets the maximum value for Integer, Decimal, Double, and Money columns. + +#### MinValue + +`Nullable MinValue { get; set; }` + +Gets or sets the minimum value for Integer, Decimal, Double, and Money columns. + +#### OptionSetName + +`string OptionSetName { get; set; }` + +Gets or sets the name of an existing global option set for Choice/Choices columns. + +#### Options + +`OptionDefinition[] Options { get; set; }` + +Gets or sets the local option definitions for new Choice/Choices columns. + +#### Precision + +`Nullable Precision { get; set; }` + +Gets or sets the precision for Decimal, Double, and Money columns. + +#### RequiredLevel + +`string RequiredLevel { get; set; }` + +Gets or sets the requirement level. Valid values: "None", "Recommended", "Required". + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets or sets the schema name for the new column. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the table. + +#### TrueLabel + +`string TrueLabel { get; set; }` + +Gets or sets the label for the true value of a Boolean column. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateColumnResult.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateColumnResult.md new file mode 100644 index 0000000..65e4df4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateColumnResult.md @@ -0,0 +1,40 @@ + + +# CreateColumnResult + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Result of a create column operation. + +## Members + +### Properties + +#### LogicalName + +`string LogicalName { get; set; }` + +Gets or sets the logical name of the created column. + +#### MetadataId + +`Guid MetadataId { get; set; }` + +Gets or sets the metadata identifier of the created column. + +#### ValidationMessages + +`ValidationMessage[] ValidationMessages { get; set; }` + +Gets or sets the validation messages produced during the operation. + +#### WasDryRun + +`bool WasDryRun { get; set; }` + +Gets or sets whether the operation was a dry run. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateGlobalChoiceRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateGlobalChoiceRequest.md new file mode 100644 index 0000000..29601b7 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateGlobalChoiceRequest.md @@ -0,0 +1,58 @@ + + +# CreateGlobalChoiceRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to create a new global choice (option set) in Dataverse. + +## Members + +### Properties + +#### Description + +`string Description { get; set; }` + +Gets or sets the description of the global choice. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the display name of the global choice. + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### IsMultiSelect + +`bool IsMultiSelect { get; set; }` + +Gets or sets whether this is a multi-select choice. + +#### Options + +`OptionDefinition[] Options { get; set; }` + +Gets or sets the option definitions for the global choice. + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets or sets the schema name for the global choice. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution to add the choice to. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateKeyRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateKeyRequest.md new file mode 100644 index 0000000..86dbd85 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateKeyRequest.md @@ -0,0 +1,52 @@ + + +# CreateKeyRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to create an alternate key on a Dataverse table. + +## Members + +### Properties + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the display name of the key. + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the logical name of the entity to add the key to. + +#### KeyAttributes + +`string[] KeyAttributes { get; set; }` + +Gets or sets the column logical names that make up the key (1-16 columns). + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets or sets the schema name for the key. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the table. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateKeyResult.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateKeyResult.md new file mode 100644 index 0000000..79660c6 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateKeyResult.md @@ -0,0 +1,40 @@ + + +# CreateKeyResult + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Result of a create alternate key operation. + +## Members + +### Properties + +#### MetadataId + +`Guid MetadataId { get; set; }` + +Gets or sets the metadata identifier of the created key. + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets or sets the schema name of the created key. + +#### ValidationMessages + +`ValidationMessage[] ValidationMessages { get; set; }` + +Gets or sets the validation messages produced during the operation. + +#### WasDryRun + +`bool WasDryRun { get; set; }` + +Gets or sets whether the operation was a dry run. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateManyToManyRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateManyToManyRequest.md new file mode 100644 index 0000000..5b797b5 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateManyToManyRequest.md @@ -0,0 +1,64 @@ + + +# CreateManyToManyRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to create a many-to-many (N:N) relationship between two Dataverse tables. + +## Members + +### Properties + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### Entity1LogicalName + +`string Entity1LogicalName { get; set; }` + +Gets or sets the logical name of the first entity. + +#### Entity1NavigationPropertyName + +`string Entity1NavigationPropertyName { get; set; }` + +Gets or sets the navigation property name on Entity1. + +#### Entity2LogicalName + +`string Entity2LogicalName { get; set; }` + +Gets or sets the logical name of the second entity. + +#### Entity2NavigationPropertyName + +`string Entity2NavigationPropertyName { get; set; }` + +Gets or sets the navigation property name on Entity2. + +#### IntersectEntitySchemaName + +`string IntersectEntitySchemaName { get; set; }` + +Gets or sets the schema name of the intersect entity. + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets or sets the schema name for the relationship. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution to add the relationship to. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateOneToManyRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateOneToManyRequest.md new file mode 100644 index 0000000..8a54c89 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateOneToManyRequest.md @@ -0,0 +1,70 @@ + + +# CreateOneToManyRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to create a one-to-many (1:N) relationship between two Dataverse tables. + +## Members + +### Properties + +#### CascadeConfiguration + +`CascadeConfigurationDto CascadeConfiguration { get; set; }` + +Gets or sets the cascade configuration for the relationship. + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### IsHierarchical + +`Nullable IsHierarchical { get; set; }` + +Gets or sets whether this is a hierarchical relationship. + +#### LookupDisplayName + +`string LookupDisplayName { get; set; }` + +Gets or sets the display name of the lookup column. + +#### LookupSchemaName + +`string LookupSchemaName { get; set; }` + +Gets or sets the schema name of the lookup column created on the referencing entity. + +#### ReferencedEntity + +`string ReferencedEntity { get; set; }` + +Gets or sets the logical name of the referenced (parent / "one" side) entity. + +#### ReferencingEntity + +`string ReferencingEntity { get; set; }` + +Gets or sets the logical name of the referencing (child / "many" side) entity. + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets or sets the schema name for the relationship. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution to add the relationship to. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateRelationshipResult.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateRelationshipResult.md new file mode 100644 index 0000000..ff5c361 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateRelationshipResult.md @@ -0,0 +1,40 @@ + + +# CreateRelationshipResult + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Result of a create relationship operation. + +## Members + +### Properties + +#### MetadataId + +`Guid MetadataId { get; set; }` + +Gets or sets the metadata identifier of the created relationship. + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets or sets the schema name of the created relationship. + +#### ValidationMessages + +`ValidationMessage[] ValidationMessages { get; set; }` + +Gets or sets the validation messages produced during the operation. + +#### WasDryRun + +`bool WasDryRun { get; set; }` + +Gets or sets whether the operation was a dry run. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateTableRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateTableRequest.md new file mode 100644 index 0000000..812e926 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateTableRequest.md @@ -0,0 +1,130 @@ + + +# CreateTableRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to create a new Dataverse table (entity). + +## Members + +### Properties + +#### ChangeTrackingEnabled + +`Nullable ChangeTrackingEnabled { get; set; }` + +Gets or sets whether change tracking is enabled. + +#### Description + +`string Description { get; set; }` + +Gets or sets the description of the table. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the display name of the table. + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### EntityColor + +`string EntityColor { get; set; }` + +Gets or sets the entity color (hex string). + +#### HasActivities + +`Nullable HasActivities { get; set; }` + +Gets or sets whether the table supports activities. + +#### HasNotes + +`Nullable HasNotes { get; set; }` + +Gets or sets whether the table supports notes (annotations). + +#### IsActivity + +`Nullable IsActivity { get; set; }` + +Gets or sets whether the table is an activity entity. + +#### IsAuditEnabled + +`Nullable IsAuditEnabled { get; set; }` + +Gets or sets whether auditing is enabled. + +#### IsDuplicateDetectionEnabled + +`Nullable IsDuplicateDetectionEnabled { get; set; }` + +Gets or sets whether duplicate detection is enabled. + +#### IsQuickCreateEnabled + +`Nullable IsQuickCreateEnabled { get; set; }` + +Gets or sets whether quick create forms are enabled. + +#### IsValidForQueue + +`Nullable IsValidForQueue { get; set; }` + +Gets or sets whether the table is valid for queues. + +#### OwnershipType + +`string OwnershipType { get; set; }` + +Gets or sets the ownership type. Valid values: "UserOwned" or "OrganizationOwned". + +#### PluralDisplayName + +`string PluralDisplayName { get; set; }` + +Gets or sets the plural display name of the table. + +#### PrimaryAttributeDisplayName + +`string PrimaryAttributeDisplayName { get; set; }` + +Gets or sets the display name for the primary attribute. + +#### PrimaryAttributeMaxLength + +`Nullable PrimaryAttributeMaxLength { get; set; }` + +Gets or sets the max length for the primary attribute. + +#### PrimaryAttributeSchemaName + +`string PrimaryAttributeSchemaName { get; set; }` + +Gets or sets the schema name for the primary attribute. + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets or sets the schema name for the new table. Prefix is auto-validated against the solution publisher. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution to add the table to. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateTableResult.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateTableResult.md new file mode 100644 index 0000000..6799616 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/CreateTableResult.md @@ -0,0 +1,40 @@ + + +# CreateTableResult + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Result of a create table operation. + +## Members + +### Properties + +#### LogicalName + +`string LogicalName { get; set; }` + +Gets or sets the logical name of the created table. + +#### MetadataId + +`Guid MetadataId { get; set; }` + +Gets or sets the metadata identifier of the created table. + +#### ValidationMessages + +`ValidationMessage[] ValidationMessages { get; set; }` + +Gets or sets the validation messages produced during the operation. + +#### WasDryRun + +`bool WasDryRun { get; set; }` + +Gets or sets whether the operation was a dry run. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteColumnRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteColumnRequest.md new file mode 100644 index 0000000..6707424 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteColumnRequest.md @@ -0,0 +1,40 @@ + + +# DeleteColumnRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to delete a column (attribute) from a Dataverse table. + +## Members + +### Properties + +#### ColumnLogicalName + +`string ColumnLogicalName { get; set; }` + +Gets or sets the logical name of the column to delete. + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the logical name of the entity containing the column. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the table. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteDryRunResult.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteDryRunResult.md new file mode 100644 index 0000000..546a970 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteDryRunResult.md @@ -0,0 +1,28 @@ + + +# DeleteDryRunResult + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Result of a delete dry-run operation, listing dependencies that would block deletion. + +## Members + +### Properties + +#### Dependencies + +`DependencyInfo[] Dependencies { get; set; }` + +Gets or sets the dependency details. + +#### DependencyCount + +`int DependencyCount { get; set; }` + +Gets or sets the total number of dependencies found. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteGlobalChoiceRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteGlobalChoiceRequest.md new file mode 100644 index 0000000..8704026 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteGlobalChoiceRequest.md @@ -0,0 +1,34 @@ + + +# DeleteGlobalChoiceRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to delete a global choice (option set) from Dataverse. + +## Members + +### Properties + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### Name + +`string Name { get; set; }` + +Gets or sets the name of the global choice to delete. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the global choice. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteKeyRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteKeyRequest.md new file mode 100644 index 0000000..f7c808b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteKeyRequest.md @@ -0,0 +1,40 @@ + + +# DeleteKeyRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to delete an alternate key from a Dataverse table. + +## Members + +### Properties + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the logical name of the entity containing the key. + +#### KeyLogicalName + +`string KeyLogicalName { get; set; }` + +Gets or sets the logical name of the key to delete. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the table. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteOptionValueRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteOptionValueRequest.md new file mode 100644 index 0000000..804ac65 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteOptionValueRequest.md @@ -0,0 +1,46 @@ + + +# DeleteOptionValueRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to delete an option value from an option set. + +## Members + +### Properties + +#### AttributeLogicalName + +`string AttributeLogicalName { get; set; }` + +Gets or sets the attribute logical name (for local option sets). + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the entity logical name (for local option sets). + +#### OptionSetName + +`string OptionSetName { get; set; }` + +Gets or sets the name of the option set. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the option set. + +#### Value + +`int Value { get; set; }` + +Gets or sets the numeric value of the option to delete. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteRelationshipRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteRelationshipRequest.md new file mode 100644 index 0000000..33a56a0 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteRelationshipRequest.md @@ -0,0 +1,34 @@ + + +# DeleteRelationshipRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to delete a Dataverse relationship. + +## Members + +### Properties + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets or sets the schema name of the relationship to delete. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the relationship. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteTableRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteTableRequest.md new file mode 100644 index 0000000..cf3f9ce --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DeleteTableRequest.md @@ -0,0 +1,34 @@ + + +# DeleteTableRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to delete a Dataverse table (entity). + +## Members + +### Properties + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the logical name of the entity to delete. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the table. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DependencyInfo.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DependencyInfo.md new file mode 100644 index 0000000..065e1be --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/DependencyInfo.md @@ -0,0 +1,34 @@ + + +# DependencyInfo + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Describes a single component dependency found during a delete dry-run. + +## Members + +### Properties + +#### DependentComponentName + +`string DependentComponentName { get; set; }` + +Gets or sets the display name of the dependent component. + +#### DependentComponentSchemaName + +`string DependentComponentSchemaName { get; set; }` + +Gets or sets the schema name of the dependent component, if available. + +#### DependentComponentType + +`string DependentComponentType { get; set; }` + +Gets or sets the type of the dependent component (e.g., "Entity", "Attribute", "Form"). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/IMetadataAuthoringProgressReporter.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/IMetadataAuthoringProgressReporter.md new file mode 100644 index 0000000..19e43e2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/IMetadataAuthoringProgressReporter.md @@ -0,0 +1,35 @@ + + +# IMetadataAuthoringProgressReporter + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Interface + +## Summary + +Lightweight progress reporter for metadata authoring operations. +Defined in the Dataverse layer to avoid dependency on PPDS.Cli. + +## Members + +### Methods + +#### ReportInfo + +`void ReportInfo(string message)` + +Reports an informational message during the authoring operation. + +- Param `message`: The informational message. + +#### ReportPhase + +`void ReportPhase(string phase, string detail)` + +Reports a phase change during the authoring operation. + +- Param `phase`: The current phase name (e.g., "Validating", "Creating table"). + +- Param `detail`: Optional detail about the phase. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/MetadataErrorCodes.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/MetadataErrorCodes.md new file mode 100644 index 0000000..9e73639 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/MetadataErrorCodes.md @@ -0,0 +1,94 @@ + + +# MetadataErrorCodes + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Machine-readable error codes for metadata authoring validation failures. + +## Members + +### Fields + +#### CannotDeleteManaged + +`string CannotDeleteManaged` + +Cannot delete a managed component. + +#### DependencyConflict + +`string DependencyConflict` + +Deletion is blocked by existing dependencies. + +#### DuplicateOptionValue + +`string DuplicateOptionValue` + +Duplicate option values detected within a single option set. + +#### DuplicateSchemaName + +`string DuplicateSchemaName` + +A component with the same schema name already exists. + +#### EntityNotFound + +`string EntityNotFound` + +The referenced entity was not found. + +#### InvalidConstraint + +`string InvalidConstraint` + +A numeric or length constraint is invalid (e.g., MaxLength < 1). + +#### InvalidKeyAttribute + +`string InvalidKeyAttribute` + +One or more key attributes are invalid for alternate key use. + +#### InvalidKeyAttributeCount + +`string InvalidKeyAttributeCount` + +Key attribute count is outside the allowed range (1-16). + +#### InvalidPrefix + +`string InvalidPrefix` + +Schema name does not start with the expected publisher prefix. + +#### InvalidSchemaName + +`string InvalidSchemaName` + +Schema name is invalid (must start with letter, alphanumeric + underscore only). + +#### KeyLimitExceeded + +`string KeyLimitExceeded` + +The maximum number of alternate keys per entity has been reached. + +#### MissingRequiredField + +`string MissingRequiredField` + +A required field is missing or empty. + +#### UseRelationshipForLookup + +`string UseRelationshipForLookup` + +Lookup columns must be created via a relationship, not directly. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/MetadataValidationException.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/MetadataValidationException.md new file mode 100644 index 0000000..bb77bec --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/MetadataValidationException.md @@ -0,0 +1,51 @@ + + +# MetadataValidationException + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Exception` +- Implements: `ISerializable` + +## Summary + +Thrown when metadata authoring validation fails. + +## Members + +### Constructors + +#### MetadataValidationException(string errorCode, string message, IReadOnlyList messages) + +`MetadataValidationException(string errorCode, string message, IReadOnlyList messages)` + +Initializes a new instance for multiple validation failures. + +#### MetadataValidationException(string errorCode, string message, string field) + +`MetadataValidationException(string errorCode, string message, string field)` + +Initializes a new instance for a single-field validation failure. + + +### Properties + +#### ErrorCode + +`string ErrorCode { get; }` + +Gets the machine-readable error code. + +#### Field + +`string Field { get; }` + +Gets the field that failed validation, if a single field caused the failure. + +#### ValidationMessages + +`IReadOnlyList ValidationMessages { get; }` + +Gets the validation messages describing all failures. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/OptionDefinition.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/OptionDefinition.md new file mode 100644 index 0000000..24ae936 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/OptionDefinition.md @@ -0,0 +1,40 @@ + + +# OptionDefinition + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Defines a single option value for a choice or choices column. + +## Members + +### Properties + +#### Color + +`string Color { get; set; }` + +Gets or sets the color associated with the option (hex string). + +#### Description + +`string Description { get; set; }` + +Gets or sets the description of the option. + +#### Label + +`string Label { get; set; }` + +Gets or sets the display label for the option. + +#### Value + +`int Value { get; set; }` + +Gets or sets the numeric value of the option. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/ReactivateKeyRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/ReactivateKeyRequest.md new file mode 100644 index 0000000..8f088eb --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/ReactivateKeyRequest.md @@ -0,0 +1,34 @@ + + +# ReactivateKeyRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to reactivate a failed alternate key on a Dataverse table. + +## Members + +### Properties + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the logical name of the entity containing the key. + +#### KeyLogicalName + +`string KeyLogicalName { get; set; }` + +Gets or sets the logical name of the key to reactivate. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the table. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/ReorderOptionsRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/ReorderOptionsRequest.md new file mode 100644 index 0000000..60f8d82 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/ReorderOptionsRequest.md @@ -0,0 +1,46 @@ + + +# ReorderOptionsRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to reorder the option values in an option set. + +## Members + +### Properties + +#### AttributeLogicalName + +`string AttributeLogicalName { get; set; }` + +Gets or sets the attribute logical name (for local option sets). + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the entity logical name (for local option sets). + +#### OptionSetName + +`string OptionSetName { get; set; }` + +Gets or sets the name of the option set. + +#### Order + +`int[] Order { get; set; }` + +Gets or sets the ordered list of option values defining the new order. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the option set. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/SchemaColumnType.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/SchemaColumnType.md new file mode 100644 index 0000000..9af6adf --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/SchemaColumnType.md @@ -0,0 +1,101 @@ + + +# SchemaColumnType + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Defines the supported column types for schema authoring operations. + +## Members + +### Fields + +#### BigInt + +`SchemaColumnType BigInt` + +Big integer (64-bit). + +#### Boolean + +`SchemaColumnType Boolean` + +Two-option (yes/no). + +#### Choice + +`SchemaColumnType Choice` + +Single-select choice. + +#### Choices + +`SchemaColumnType Choices` + +Multi-select choices. + +#### DateTime + +`SchemaColumnType DateTime` + +Date and time. + +#### Decimal + +`SchemaColumnType Decimal` + +Decimal number. + +#### Double + +`SchemaColumnType Double` + +Floating-point number. + +#### File + +`SchemaColumnType File` + +File column. + +#### Image + +`SchemaColumnType Image` + +Image column. + +#### Integer + +`SchemaColumnType Integer` + +Whole number. + +#### Lookup + +`SchemaColumnType Lookup` + +Lookup (foreign key reference). + +#### Memo + +`SchemaColumnType Memo` + +Multi-line text. + +#### Money + +`SchemaColumnType Money` + +Currency. + +#### String + +`SchemaColumnType String` + +Single-line text. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/SchemaValidator.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/SchemaValidator.md new file mode 100644 index 0000000..2ccf262 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/SchemaValidator.md @@ -0,0 +1,72 @@ + + +# SchemaValidator + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Validates metadata authoring requests before SDK calls. +Pure logic, no Dataverse dependencies. + +## Members + +### Methods + +#### ValidateCreateColumnRequest + +`void ValidateCreateColumnRequest(CreateColumnRequest request, string publisherPrefix)` + +Validates a `PPDS.Dataverse.Metadata.Authoring.CreateColumnRequest`. Rejects Lookup type. + +#### ValidateCreateGlobalChoiceRequest + +`void ValidateCreateGlobalChoiceRequest(CreateGlobalChoiceRequest request, string publisherPrefix)` + +Validates a `PPDS.Dataverse.Metadata.Authoring.CreateGlobalChoiceRequest`. + +#### ValidateCreateKeyRequest + +`void ValidateCreateKeyRequest(CreateKeyRequest request, string publisherPrefix)` + +Validates a `PPDS.Dataverse.Metadata.Authoring.CreateKeyRequest`. Key attributes must be between 1 and 16. + +#### ValidateCreateManyToManyRequest + +`void ValidateCreateManyToManyRequest(CreateManyToManyRequest request, string publisherPrefix)` + +Validates a `PPDS.Dataverse.Metadata.Authoring.CreateManyToManyRequest`. + +#### ValidateCreateOneToManyRequest + +`void ValidateCreateOneToManyRequest(CreateOneToManyRequest request, string publisherPrefix)` + +Validates a `PPDS.Dataverse.Metadata.Authoring.CreateOneToManyRequest`. + +#### ValidateCreateTableRequest + +`void ValidateCreateTableRequest(CreateTableRequest request, string publisherPrefix)` + +Validates a `PPDS.Dataverse.Metadata.Authoring.CreateTableRequest`. + +#### ValidatePrefix + +`void ValidatePrefix(string schemaName, string expectedPrefix, string fieldName)` + +Validates that a schema name starts with the expected publisher prefix. + +#### ValidateRequiredString + +`void ValidateRequiredString(string value, string fieldName)` + +Validates that a required string value is non-null and non-empty. + +#### ValidateSchemaName + +`void ValidateSchemaName(string schemaName, string fieldName)` + +Validates that a schema name follows Dataverse naming rules. +Must start with a letter and contain only alphanumeric characters and underscores. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateColumnRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateColumnRequest.md new file mode 100644 index 0000000..9bdf174 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateColumnRequest.md @@ -0,0 +1,112 @@ + + +# UpdateColumnRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to update an existing column (attribute) on a Dataverse table. + +## Members + +### Properties + +#### AutoNumberFormat + +`string AutoNumberFormat { get; set; }` + +Gets or sets the updated auto-number format string. + +#### ColumnLogicalName + +`string ColumnLogicalName { get; set; }` + +Gets or sets the logical name of the column to update. + +#### Description + +`string Description { get; set; }` + +Gets or sets the updated description. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the updated display name. + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the logical name of the entity containing the column. + +#### Format + +`string Format { get; set; }` + +Gets or sets the updated format. + +#### IsAuditEnabled + +`Nullable IsAuditEnabled { get; set; }` + +Gets or sets whether auditing is enabled for the column. + +#### IsSecured + +`Nullable IsSecured { get; set; }` + +Gets or sets whether the column is secured (field-level security). + +#### IsValidForAdvancedFind + +`Nullable IsValidForAdvancedFind { get; set; }` + +Gets or sets whether the column is valid for Advanced Find. + +#### MaxLength + +`Nullable MaxLength { get; set; }` + +Gets or sets the updated maximum length. + +#### MaxValue + +`Nullable MaxValue { get; set; }` + +Gets or sets the updated maximum value. + +#### MinValue + +`Nullable MinValue { get; set; }` + +Gets or sets the updated minimum value. + +#### Precision + +`Nullable Precision { get; set; }` + +Gets or sets the updated precision. + +#### RequiredLevel + +`string RequiredLevel { get; set; }` + +Gets or sets the updated requirement level. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the table. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateGlobalChoiceRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateGlobalChoiceRequest.md new file mode 100644 index 0000000..ff92309 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateGlobalChoiceRequest.md @@ -0,0 +1,46 @@ + + +# UpdateGlobalChoiceRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to update an existing global choice (option set) in Dataverse. + +## Members + +### Properties + +#### Description + +`string Description { get; set; }` + +Gets or sets the updated description. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the updated display name. + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### Name + +`string Name { get; set; }` + +Gets or sets the name of the global choice to update. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the global choice. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateOptionValueRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateOptionValueRequest.md new file mode 100644 index 0000000..32e64d3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateOptionValueRequest.md @@ -0,0 +1,64 @@ + + +# UpdateOptionValueRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to update an existing option value in an option set. + +## Members + +### Properties + +#### AttributeLogicalName + +`string AttributeLogicalName { get; set; }` + +Gets or sets the attribute logical name (for local option sets). + +#### Color + +`string Color { get; set; }` + +Gets or sets the updated color for the option (hex string). + +#### Description + +`string Description { get; set; }` + +Gets or sets the updated description for the option. + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the entity logical name (for local option sets). + +#### Label + +`string Label { get; set; }` + +Gets or sets the updated label for the option. + +#### OptionSetName + +`string OptionSetName { get; set; }` + +Gets or sets the name of the option set. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the option set. + +#### Value + +`int Value { get; set; }` + +Gets or sets the numeric value of the option to update. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateRelationshipRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateRelationshipRequest.md new file mode 100644 index 0000000..5073512 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateRelationshipRequest.md @@ -0,0 +1,46 @@ + + +# UpdateRelationshipRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to update an existing Dataverse relationship. + +## Members + +### Properties + +#### CascadeConfiguration + +`CascadeConfigurationDto CascadeConfiguration { get; set; }` + +Gets or sets the updated cascade configuration. + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### IsHierarchical + +`Nullable IsHierarchical { get; set; }` + +Gets or sets whether this is a hierarchical relationship. + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets or sets the schema name of the relationship to update. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the relationship. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateStateValueRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateStateValueRequest.md new file mode 100644 index 0000000..37dd0b4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateStateValueRequest.md @@ -0,0 +1,46 @@ + + +# UpdateStateValueRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to update a state or status option value label. + +## Members + +### Properties + +#### AttributeLogicalName + +`string AttributeLogicalName { get; set; }` + +Gets or sets the logical name of the state/status attribute. + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the logical name of the entity. + +#### Label + +`string Label { get; set; }` + +Gets or sets the updated label for the state/status option. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the entity. + +#### Value + +`int Value { get; set; }` + +Gets or sets the numeric value of the state/status option to update. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateTableRequest.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateTableRequest.md new file mode 100644 index 0000000..2b259bf --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/UpdateTableRequest.md @@ -0,0 +1,100 @@ + + +# UpdateTableRequest + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Request to update an existing Dataverse table (entity). + +## Members + +### Properties + +#### ChangeTrackingEnabled + +`Nullable ChangeTrackingEnabled { get; set; }` + +Gets or sets whether change tracking is enabled. + +#### Description + +`string Description { get; set; }` + +Gets or sets the updated description. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the updated display name. + +#### DryRun + +`bool DryRun { get; set; }` + +Gets or sets whether this is a dry-run (validation only, no changes persisted). + +#### EntityColor + +`string EntityColor { get; set; }` + +Gets or sets the entity color (hex string). + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the logical name of the entity to update. + +#### HasActivities + +`Nullable HasActivities { get; set; }` + +Gets or sets whether the table supports activities. + +#### HasNotes + +`Nullable HasNotes { get; set; }` + +Gets or sets whether the table supports notes (annotations). + +#### IsAuditEnabled + +`Nullable IsAuditEnabled { get; set; }` + +Gets or sets whether auditing is enabled. + +#### IsDuplicateDetectionEnabled + +`Nullable IsDuplicateDetectionEnabled { get; set; }` + +Gets or sets whether duplicate detection is enabled. + +#### IsQuickCreateEnabled + +`Nullable IsQuickCreateEnabled { get; set; }` + +Gets or sets whether quick create forms are enabled. + +#### IsValidForQueue + +`Nullable IsValidForQueue { get; set; }` + +Gets or sets whether the table is valid for queues. + +#### PluralDisplayName + +`string PluralDisplayName { get; set; }` + +Gets or sets the updated plural display name. + +#### SolutionUniqueName + +`string SolutionUniqueName { get; set; }` + +Gets or sets the unique name of the solution containing the table. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/ValidationMessage.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/ValidationMessage.md new file mode 100644 index 0000000..d911c48 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Authoring/ValidationMessage.md @@ -0,0 +1,34 @@ + + +# ValidationMessage + +- Namespace: `PPDS.Dataverse.Metadata.Authoring` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Represents a validation message produced during a dry-run or schema authoring operation. + +## Members + +### Properties + +#### Field + +`string Field { get; set; }` + +Gets or sets the name of the field that triggered the validation. + +#### Message + +`string Message { get; set; }` + +Gets or sets the human-readable validation message. + +#### Rule + +`string Rule { get; set; }` + +Gets or sets the validation rule identifier. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/CachedMetadataProvider.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/CachedMetadataProvider.md new file mode 100644 index 0000000..d1da5d8 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/CachedMetadataProvider.md @@ -0,0 +1,109 @@ + + +# CachedMetadataProvider + +- Namespace: `PPDS.Dataverse.Metadata` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `ICachedMetadataProvider`, `IDisposable` + +## Summary + +Provides cached access to Dataverse metadata, wrapping `PPDS.Dataverse.Metadata.IMetadataQueryService` +with per-session caching to minimize round-trips. + +## Members + +### Constructors + +#### CachedMetadataProvider(IMetadataQueryService metadataService) + +`CachedMetadataProvider(IMetadataQueryService metadataService)` + +Creates a new `PPDS.Dataverse.Metadata.CachedMetadataProvider`. + +- Param `metadataService`: The underlying metadata service. + + +### Methods + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### GetAttributesAsync + +`Task> GetAttributesAsync(string entityLogicalName, CancellationToken ct)` + +Gets attributes for an entity. Lazy-loaded on first access and cached with a 5-minute TTL. + +- Param `entityLogicalName`: The entity logical name. + +- Param `ct`: Cancellation token. + +- Returns: List of attribute metadata. + +#### GetEntitiesAsync + +`Task> GetEntitiesAsync(CancellationToken ct)` + +Gets all entities from cache. The entity list is populated by `PPDS.Dataverse.Metadata.ICachedMetadataProvider.PreloadAsync(System.Threading.CancellationToken)` +and cached indefinitely for the session lifetime. + +- Param `ct`: Cancellation token. + +- Returns: List of entity summaries. + +#### GetRelationshipsAsync + +`Task GetRelationshipsAsync(string entityLogicalName, CancellationToken ct)` + +Gets relationships for an entity. Lazy-loaded on first access and cached with a 5-minute TTL. + +- Param `entityLogicalName`: The entity logical name. + +- Param `ct`: Cancellation token. + +- Returns: Entity relationships grouped by type. + +#### InvalidateAll + +`void InvalidateAll()` + +Invalidates all cached metadata. The next access will re-fetch from Dataverse. + +#### InvalidateEntity + +`void InvalidateEntity(string entityLogicalName)` + +Invalidates cached metadata for a specific entity (attributes and relationships). +The entity list cache is not affected. + +- Param `entityLogicalName`: The entity logical name to invalidate. + +#### InvalidateEntityList + +`void InvalidateEntityList()` + +Invalidates the cached entity list. The next call to `PPDS.Dataverse.Metadata.ICachedMetadataProvider.GetEntitiesAsync(System.Threading.CancellationToken)` +will re-fetch from Dataverse. Use after table create/delete operations. + +#### InvalidateGlobalOptionSets + +`void InvalidateGlobalOptionSets()` + +Invalidates any cached global option set data. Currently a no-op since global option +sets are not cached, but provides a stable API for cache invalidation after global +choice create/update/delete operations. + +#### PreloadAsync + +`Task PreloadAsync(CancellationToken ct)` + +Eagerly loads the entity list into cache. Call this early (e.g., on environment connect) +so that entity names are available for IntelliSense without delay. + +- Param `ct`: Cancellation token. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/DataverseMetadataQueryService.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/DataverseMetadataQueryService.md new file mode 100644 index 0000000..c908417 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/DataverseMetadataQueryService.md @@ -0,0 +1,137 @@ + + +# DataverseMetadataQueryService + +- Namespace: `PPDS.Dataverse.Metadata` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IMetadataQueryService` + +## Summary + +Provides access to Dataverse metadata using the SDK. + +## Members + +### Constructors + +#### DataverseMetadataQueryService(IDataverseConnectionPool connectionPool, ILogger logger) + +`DataverseMetadataQueryService(IDataverseConnectionPool connectionPool, ILogger logger)` + +Initializes a new instance of the `PPDS.Dataverse.Metadata.DataverseMetadataQueryService` class. + +- Param `connectionPool`: The connection pool. + +- Param `logger`: Optional logger. + + +### Methods + +#### GetAttributesAsync + +`Task> GetAttributesAsync(string entityLogicalName, string attributeType, CancellationToken cancellationToken)` + +Gets all attributes for an entity. + +- Param `entityLogicalName`: The entity logical name. + +- Param `attributeType`: Optional filter by attribute type (e.g., "Lookup", "String"). + +- Param `cancellationToken`: Cancellation token. + +- Returns: List of attribute metadata. + +#### GetEntitiesAsync + +`Task> GetEntitiesAsync(bool customOnly, string filter, bool includeIntersect, CancellationToken cancellationToken)` + +Gets a list of all entities with basic information. + +- Param `customOnly`: If true, only return custom entities. + +- Param `filter`: Optional filter pattern to match entity logical names (supports * wildcard). + +- Param `includeIntersect`: If true, include intersection entities (default: false). + +- Param `cancellationToken`: Cancellation token. + +- Returns: List of entity summaries. + +#### GetEntityAsync + +`Task GetEntityAsync(string logicalName, bool includeAttributes, bool includeRelationships, bool includeKeys, bool includePrivileges, CancellationToken cancellationToken)` + +Gets full metadata for a specific entity including attributes, relationships, keys, and privileges. + +- Param `logicalName`: The entity logical name. + +- Param `includeAttributes`: Include attributes in the response. + +- Param `includeRelationships`: Include relationships in the response. + +- Param `includeKeys`: Include alternate keys in the response. + +- Param `includePrivileges`: Include privileges in the response. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Full entity metadata. + +#### GetEntityWithGlobalOptionSetsAsync + +`Task>> GetEntityWithGlobalOptionSetsAsync(string logicalName, bool includeGlobalOptionSets, CancellationToken cancellationToken)` + +Gets full metadata for a specific entity, optionally including +global option set values for picklist attributes. + +#### GetGlobalOptionSetsAsync + +`Task> GetGlobalOptionSetsAsync(string filter, CancellationToken cancellationToken)` + +Gets all global option sets. + +- Param `filter`: Optional filter pattern to match option set names (supports * wildcard). + +- Param `cancellationToken`: Cancellation token. + +- Returns: List of option set summaries. + +#### GetKeysAsync + +`Task> GetKeysAsync(string entityLogicalName, CancellationToken cancellationToken)` + +Gets all alternate keys for an entity. + +- Param `entityLogicalName`: The entity logical name. + +- Param `cancellationToken`: Cancellation token. + +- Returns: List of entity key metadata. + +#### GetOptionSetAsync + +`Task GetOptionSetAsync(string name, CancellationToken cancellationToken)` + +Gets a specific global option set with all values. + +- Param `name`: The option set name. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Full option set metadata with values. + +#### GetRelationshipsAsync + +`Task GetRelationshipsAsync(string entityLogicalName, string relationshipType, CancellationToken cancellationToken)` + +Gets all relationships for an entity. + +- Param `entityLogicalName`: The entity logical name. + +- Param `relationshipType`: Optional filter by type (OneToMany, ManyToOne, ManyToMany). + +- Param `cancellationToken`: Cancellation token. + +- Returns: Entity relationships grouped by type. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/ICachedMetadataProvider.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/ICachedMetadataProvider.md new file mode 100644 index 0000000..34226d8 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/ICachedMetadataProvider.md @@ -0,0 +1,92 @@ + + +# ICachedMetadataProvider + +- Namespace: `PPDS.Dataverse.Metadata` +- Assembly: `PPDS.Dataverse` +- Kind: Interface + +## Summary + +Provides cached access to Dataverse metadata for IntelliSense and entity browsing. +Wraps `PPDS.Dataverse.Metadata.IMetadataQueryService` with per-session caching to avoid redundant +round-trips to Dataverse for metadata that rarely changes. + +## Members + +### Methods + +#### GetAttributesAsync + +`Task> GetAttributesAsync(string entityLogicalName, CancellationToken ct)` + +Gets attributes for an entity. Lazy-loaded on first access and cached with a 5-minute TTL. + +- Param `entityLogicalName`: The entity logical name. + +- Param `ct`: Cancellation token. + +- Returns: List of attribute metadata. + +#### GetEntitiesAsync + +`Task> GetEntitiesAsync(CancellationToken ct)` + +Gets all entities from cache. The entity list is populated by `PPDS.Dataverse.Metadata.ICachedMetadataProvider.PreloadAsync(System.Threading.CancellationToken)` +and cached indefinitely for the session lifetime. + +- Param `ct`: Cancellation token. + +- Returns: List of entity summaries. + +#### GetRelationshipsAsync + +`Task GetRelationshipsAsync(string entityLogicalName, CancellationToken ct)` + +Gets relationships for an entity. Lazy-loaded on first access and cached with a 5-minute TTL. + +- Param `entityLogicalName`: The entity logical name. + +- Param `ct`: Cancellation token. + +- Returns: Entity relationships grouped by type. + +#### InvalidateAll + +`void InvalidateAll()` + +Invalidates all cached metadata. The next access will re-fetch from Dataverse. + +#### InvalidateEntity + +`void InvalidateEntity(string entityLogicalName)` + +Invalidates cached metadata for a specific entity (attributes and relationships). +The entity list cache is not affected. + +- Param `entityLogicalName`: The entity logical name to invalidate. + +#### InvalidateEntityList + +`void InvalidateEntityList()` + +Invalidates the cached entity list. The next call to `PPDS.Dataverse.Metadata.ICachedMetadataProvider.GetEntitiesAsync(System.Threading.CancellationToken)` +will re-fetch from Dataverse. Use after table create/delete operations. + +#### InvalidateGlobalOptionSets + +`void InvalidateGlobalOptionSets()` + +Invalidates any cached global option set data. Currently a no-op since global option +sets are not cached, but provides a stable API for cache invalidation after global +choice create/update/delete operations. + +#### PreloadAsync + +`Task PreloadAsync(CancellationToken ct)` + +Eagerly loads the entity list into cache. Call this early (e.g., on environment connect) +so that entity names are available for IntelliSense without delay. + +- Param `ct`: Cancellation token. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/IMetadataQueryExecutor.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/IMetadataQueryExecutor.md new file mode 100644 index 0000000..2d0a826 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/IMetadataQueryExecutor.md @@ -0,0 +1,43 @@ + + +# IMetadataQueryExecutor + +- Namespace: `PPDS.Dataverse.Metadata` +- Assembly: `PPDS.Dataverse` +- Kind: Interface + +## Summary + +Executes metadata queries against Dataverse, returning results as QueryRow format. +Maps virtual metadata tables to appropriate Dataverse metadata API calls. + +## Members + +### Methods + +#### GetAvailableColumns + +`IReadOnlyList GetAvailableColumns(string tableName)` + +Gets the available columns for a metadata virtual table. + +#### IsMetadataTable + +`bool IsMetadataTable(string schemaQualifiedName)` + +Returns true if the table name is a known metadata virtual table. + +#### QueryMetadataAsync + +`Task>> QueryMetadataAsync(string tableName, IReadOnlyList requestedColumns, CancellationToken cancellationToken)` + +Queries metadata for a virtual table. + +- Param `tableName`: The metadata table name (entity, attribute, relationship_1_n, etc.). + +- Param `requestedColumns`: Columns to return (null = all). + +- Param `cancellationToken`: Cancellation token. + +- Returns: The metadata rows. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/IMetadataQueryService.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/IMetadataQueryService.md new file mode 100644 index 0000000..34d9ddc --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/IMetadataQueryService.md @@ -0,0 +1,123 @@ + + +# IMetadataQueryService + +- Namespace: `PPDS.Dataverse.Metadata` +- Assembly: `PPDS.Dataverse` +- Kind: Interface + +## Summary + +Provides access to Dataverse metadata for entity browsing and discovery. + +## Members + +### Methods + +#### GetAttributesAsync + +`Task> GetAttributesAsync(string entityLogicalName, string attributeType, CancellationToken cancellationToken)` + +Gets all attributes for an entity. + +- Param `entityLogicalName`: The entity logical name. + +- Param `attributeType`: Optional filter by attribute type (e.g., "Lookup", "String"). + +- Param `cancellationToken`: Cancellation token. + +- Returns: List of attribute metadata. + +#### GetEntitiesAsync + +`Task> GetEntitiesAsync(bool customOnly, string filter, bool includeIntersect, CancellationToken cancellationToken)` + +Gets a list of all entities with basic information. + +- Param `customOnly`: If true, only return custom entities. + +- Param `filter`: Optional filter pattern to match entity logical names (supports * wildcard). + +- Param `includeIntersect`: If true, include intersection entities (default: false). + +- Param `cancellationToken`: Cancellation token. + +- Returns: List of entity summaries. + +#### GetEntityAsync + +`Task GetEntityAsync(string logicalName, bool includeAttributes, bool includeRelationships, bool includeKeys, bool includePrivileges, CancellationToken cancellationToken)` + +Gets full metadata for a specific entity including attributes, relationships, keys, and privileges. + +- Param `logicalName`: The entity logical name. + +- Param `includeAttributes`: Include attributes in the response. + +- Param `includeRelationships`: Include relationships in the response. + +- Param `includeKeys`: Include alternate keys in the response. + +- Param `includePrivileges`: Include privileges in the response. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Full entity metadata. + +#### GetEntityWithGlobalOptionSetsAsync + +`Task>> GetEntityWithGlobalOptionSetsAsync(string logicalName, bool includeGlobalOptionSets, CancellationToken cancellationToken)` + +Gets full metadata for a specific entity, optionally including +global option set values for picklist attributes. + +#### GetGlobalOptionSetsAsync + +`Task> GetGlobalOptionSetsAsync(string filter, CancellationToken cancellationToken)` + +Gets all global option sets. + +- Param `filter`: Optional filter pattern to match option set names (supports * wildcard). + +- Param `cancellationToken`: Cancellation token. + +- Returns: List of option set summaries. + +#### GetKeysAsync + +`Task> GetKeysAsync(string entityLogicalName, CancellationToken cancellationToken)` + +Gets all alternate keys for an entity. + +- Param `entityLogicalName`: The entity logical name. + +- Param `cancellationToken`: Cancellation token. + +- Returns: List of entity key metadata. + +#### GetOptionSetAsync + +`Task GetOptionSetAsync(string name, CancellationToken cancellationToken)` + +Gets a specific global option set with all values. + +- Param `name`: The option set name. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Full option set metadata with values. + +#### GetRelationshipsAsync + +`Task GetRelationshipsAsync(string entityLogicalName, string relationshipType, CancellationToken cancellationToken)` + +Gets all relationships for an entity. + +- Param `entityLogicalName`: The entity logical name. + +- Param `relationshipType`: Optional filter by type (OneToMany, ManyToOne, ManyToMany). + +- Param `cancellationToken`: Cancellation token. + +- Returns: Entity relationships grouped by type. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/MetadataQueryExecutor.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/MetadataQueryExecutor.md new file mode 100644 index 0000000..81c3be2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/MetadataQueryExecutor.md @@ -0,0 +1,55 @@ + + +# MetadataQueryExecutor + +- Namespace: `PPDS.Dataverse.Metadata` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IMetadataQueryExecutor` + +## Summary + +Queries Dataverse metadata via `PPDS.Dataverse.Metadata.IMetadataQueryService` and returns results +as virtual table rows (dictionaries of `PPDS.Dataverse.Query.QueryValue`). +Bridges the rich DTO-based metadata API to the flat row format used by the query engine. + +## Members + +### Constructors + +#### MetadataQueryExecutor(IMetadataQueryService metadataService) + +`MetadataQueryExecutor(IMetadataQueryService metadataService)` + +Creates executor with an optional metadata service. +When null, all queries return empty results (useful for offline/testing scenarios). + + +### Methods + +#### GetAvailableColumns + +`IReadOnlyList GetAvailableColumns(string tableName)` + +Gets the available columns for a metadata virtual table. + +#### IsMetadataTable + +`bool IsMetadataTable(string schemaQualifiedName)` + +Returns true if the table name is a known metadata virtual table. + +#### QueryMetadataAsync + +`Task>> QueryMetadataAsync(string tableName, IReadOnlyList requestedColumns, CancellationToken cancellationToken)` + +Queries metadata for a virtual table. + +- Param `tableName`: The metadata table name (entity, attribute, relationship_1_n, etc.). + +- Param `requestedColumns`: Columns to return (null = all). + +- Param `cancellationToken`: Cancellation token. + +- Returns: The metadata rows. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/MetadataTableDefinitions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/MetadataTableDefinitions.md new file mode 100644 index 0000000..b630803 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/MetadataTableDefinitions.md @@ -0,0 +1,48 @@ + + +# MetadataTableDefinitions + +- Namespace: `PPDS.Dataverse.Metadata` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Defines the schema of metadata virtual tables. +Each table maps to a Dataverse metadata API endpoint and exposes +a fixed set of columns that can be queried via SQL. + +## Members + +### Methods + +#### GetColumns + +`IReadOnlyList GetColumns(string tableName)` + +Gets the available columns for a metadata virtual table. +Returns null if the table name is not recognized. + +#### GetTableName + +`string GetTableName(string schemaQualifiedName)` + +Extracts the table name from a potentially schema-qualified name. +"metadata.entity" returns "entity"; "entity" returns "entity". + +#### IsMetadataTable + +`bool IsMetadataTable(string name)` + +Returns true if the name matches a metadata virtual table. +The table name must be fully qualified (metadata.entity). + + +### Fields + +#### Tables + +`IReadOnlyDictionary> Tables` + +Known metadata virtual table names and their available columns. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/AttributeMetadataDto.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/AttributeMetadataDto.md new file mode 100644 index 0000000..4f63928 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/AttributeMetadataDto.md @@ -0,0 +1,262 @@ + + +# AttributeMetadataDto + +- Namespace: `PPDS.Dataverse.Metadata.Models` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Detailed attribute metadata for entity browsing. + +## Members + +### Properties + +#### AttributeOf + +`string AttributeOf { get; set; }` + +Gets the parent attribute name for computed/virtual attributes. + +#### AttributeType + +`string AttributeType { get; set; }` + +Gets the attribute type (String, Integer, Lookup, etc.). + +#### AttributeTypeName + +`string AttributeTypeName { get; set; }` + +Gets the attribute type name for virtual attributes. + +#### AutoNumberFormat + +`string AutoNumberFormat { get; set; }` + +Gets the auto-number format pattern for auto-number attributes. + +#### CanBeSecuredForCreate + +`bool CanBeSecuredForCreate { get; set; }` + +Gets whether the attribute can be secured for create operations. + +#### CanBeSecuredForRead + +`bool CanBeSecuredForRead { get; set; }` + +Gets whether the attribute can be secured for read operations. + +#### CanBeSecuredForUpdate + +`bool CanBeSecuredForUpdate { get; set; }` + +Gets whether the attribute can be secured for update operations. + +#### DateTimeBehavior + +`string DateTimeBehavior { get; set; }` + +Gets the date time behavior for datetime attributes. + +#### Description + +`string Description { get; set; }` + +Gets the description of the attribute. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets the attribute display name. + +#### Format + +`string Format { get; set; }` + +Gets the format for datetime attributes. + +#### FormulaDefinition + +`string FormulaDefinition { get; set; }` + +Gets the formula definition for calculated fields. + +#### IntroducedVersion + +`string IntroducedVersion { get; set; }` + +Gets the version when this attribute was introduced. + +#### IsCustomAttribute + +`bool IsCustomAttribute { get; set; }` + +Gets whether this is a custom attribute. + +#### IsFilterable + +`bool IsFilterable { get; set; }` + +Gets whether the attribute is filterable. + +#### IsGlobalOptionSet + +`bool IsGlobalOptionSet { get; set; }` + +Gets whether this is a global option set. + +#### IsLogical + +`bool IsLogical { get; set; }` + +Gets whether this is a logical (non-physical) attribute. + +#### IsManaged + +`bool IsManaged { get; set; }` + +Gets whether this attribute is part of a managed solution. + +#### IsPrimaryId + +`bool IsPrimaryId { get; set; }` + +Gets whether this attribute is the primary ID. + +#### IsPrimaryName + +`bool IsPrimaryName { get; set; }` + +Gets whether this attribute is the primary name. + +#### IsRetrievable + +`bool IsRetrievable { get; set; }` + +Gets whether the attribute is retrievable via the API. + +#### IsSearchable + +`bool IsSearchable { get; set; }` + +Gets whether the attribute is searchable. + +#### IsSecured + +`bool IsSecured { get; set; }` + +Gets whether field-level security is enabled for this attribute. + +#### IsSortable + +`bool IsSortable { get; set; }` + +Gets whether the attribute is sortable. + +#### IsValidForCreate + +`bool IsValidForCreate { get; set; }` + +Gets whether the attribute is valid for create. + +#### IsValidForForm + +`bool IsValidForForm { get; set; }` + +Gets whether the attribute is valid for display on forms. + +#### IsValidForGrid + +`bool IsValidForGrid { get; set; }` + +Gets whether the attribute is valid for display in grids. + +#### IsValidForRead + +`bool IsValidForRead { get; set; }` + +Gets whether the attribute is valid for read. + +#### IsValidForUpdate + +`bool IsValidForUpdate { get; set; }` + +Gets whether the attribute is valid for update. + +#### LogicalName + +`string LogicalName { get; set; }` + +Gets the attribute logical name. + +#### MaxLength + +`Nullable MaxLength { get; set; }` + +Gets the maximum length for string attributes. + +#### MaxValue + +`Nullable MaxValue { get; set; }` + +Gets the maximum value for numeric attributes. + +#### MetadataId + +`Guid MetadataId { get; set; }` + +Gets the unique metadata identifier. + +#### MinValue + +`Nullable MinValue { get; set; }` + +Gets the minimum value for numeric attributes. + +#### OptionSetName + +`string OptionSetName { get; set; }` + +Gets the option set name for picklist attributes. + +#### Options + +`List Options { get; set; }` + +Gets the inline option set values for local picklist attributes. + +#### Precision + +`Nullable Precision { get; set; }` + +Gets the precision for decimal/money attributes. + +#### RequiredLevel + +`string RequiredLevel { get; set; }` + +Gets the required level (None, Recommended, ApplicationRequired, SystemRequired). + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets the attribute schema name. + +#### SourceType + +`Nullable SourceType { get; set; }` + +Gets the source type (0=Simple, 1=Calculated, 2=Rollup). + +#### Targets + +`List Targets { get; set; }` + +Gets the lookup targets for lookup attributes (pipe-delimited for polymorphic). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/EntityKeyDto.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/EntityKeyDto.md new file mode 100644 index 0000000..b7d5fd0 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/EntityKeyDto.md @@ -0,0 +1,64 @@ + + +# EntityKeyDto + +- Namespace: `PPDS.Dataverse.Metadata.Models` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Represents an alternate key definition for an entity. + +## Members + +### Properties + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets the display name of the key. + +#### EntityKeyIndexStatus + +`string EntityKeyIndexStatus { get; set; }` + +Gets the entity key index status. + +#### IsCustomizable + +`bool IsCustomizable { get; set; }` + +Gets whether this is a custom key. + +#### IsManaged + +`bool IsManaged { get; set; }` + +Gets whether this key is part of a managed solution. + +#### KeyAttributes + +`List KeyAttributes { get; set; }` + +Gets the attributes that make up this key. + +#### LogicalName + +`string LogicalName { get; set; }` + +Gets the logical name of the key. + +#### MetadataId + +`Guid MetadataId { get; set; }` + +Gets the unique metadata identifier. + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets the schema name of the key. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/EntityMetadataDto.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/EntityMetadataDto.md new file mode 100644 index 0000000..4b57bb7 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/EntityMetadataDto.md @@ -0,0 +1,226 @@ + + +# EntityMetadataDto + +- Namespace: `PPDS.Dataverse.Metadata.Models` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Full entity metadata including attributes, relationships, keys, and privileges. + +## Members + +### Properties + +#### Attributes + +`List Attributes { get; set; }` + +Gets the entity attributes. + +#### CanCreateMultiple + +`bool CanCreateMultiple { get; set; }` + +Gets whether the entity supports the CreateMultiple bulk API. + +#### CanUpdateMultiple + +`bool CanUpdateMultiple { get; set; }` + +Gets whether the entity supports the UpdateMultiple bulk API. + +#### ChangeTrackingEnabled + +`bool ChangeTrackingEnabled { get; set; }` + +Gets whether change tracking is enabled. + +#### Description + +`string Description { get; set; }` + +Gets the description of the entity. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets the entity display name. + +#### EntitySetName + +`string EntitySetName { get; set; }` + +Gets the entity set name (for Web API). + +#### HasActivities + +`bool HasActivities { get; set; }` + +Gets whether the entity supports activities. + +#### HasNotes + +`bool HasNotes { get; set; }` + +Gets whether the entity supports notes (annotations). + +#### IsActivity + +`bool IsActivity { get; set; }` + +Gets whether the entity is activity. + +#### IsActivityParty + +`bool IsActivityParty { get; set; }` + +Gets whether the entity is activity party. + +#### IsAuditEnabled + +`bool IsAuditEnabled { get; set; }` + +Gets whether audit is enabled. + +#### IsBusinessProcessEnabled + +`bool IsBusinessProcessEnabled { get; set; }` + +Gets whether business process flows are enabled. + +#### IsCustomEntity + +`bool IsCustomEntity { get; set; }` + +Gets whether this is a custom entity. + +#### IsDuplicateDetectionEnabled + +`bool IsDuplicateDetectionEnabled { get; set; }` + +Gets whether duplicate detection is enabled. + +#### IsIntersect + +`bool IsIntersect { get; set; }` + +Gets whether this is an intersect entity. + +#### IsManaged + +`bool IsManaged { get; set; }` + +Gets whether this entity is part of a managed solution. + +#### IsQuickCreateEnabled + +`bool IsQuickCreateEnabled { get; set; }` + +Gets whether quick create is enabled. + +#### IsValidForAdvancedFind + +`bool IsValidForAdvancedFind { get; set; }` + +Gets whether the entity is valid for Advanced Find. + +#### IsValidForQueue + +`bool IsValidForQueue { get; set; }` + +Gets whether the entity is valid for queue. + +#### Keys + +`List Keys { get; set; }` + +Gets the entity alternate keys. + +#### LogicalCollectionName + +`string LogicalCollectionName { get; set; }` + +Gets the logical collection name. + +#### LogicalName + +`string LogicalName { get; set; }` + +Gets the entity logical name. + +#### ManyToManyRelationships + +`List ManyToManyRelationships { get; set; }` + +Gets the many-to-many relationships. + +#### ManyToOneRelationships + +`List ManyToOneRelationships { get; set; }` + +Gets the many-to-one relationships. + +#### MetadataId + +`Guid MetadataId { get; set; }` + +Gets the unique metadata identifier. + +#### ObjectTypeCode + +`int ObjectTypeCode { get; set; }` + +Gets the entity type code. + +#### OneToManyRelationships + +`List OneToManyRelationships { get; set; }` + +Gets the one-to-many relationships. + +#### OwnershipType + +`string OwnershipType { get; set; }` + +Gets the ownership type (UserOwned, OrganizationOwned, None). + +#### PluralName + +`string PluralName { get; set; }` + +Gets the entity plural display name (collection name). + +#### PrimaryIdAttribute + +`string PrimaryIdAttribute { get; set; }` + +Gets the primary ID attribute. + +#### PrimaryImageAttribute + +`string PrimaryImageAttribute { get; set; }` + +Gets the primary image attribute. + +#### PrimaryNameAttribute + +`string PrimaryNameAttribute { get; set; }` + +Gets the primary name attribute. + +#### Privileges + +`List Privileges { get; set; }` + +Gets the entity privileges. + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets the entity schema name. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/EntityRelationshipsDto.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/EntityRelationshipsDto.md new file mode 100644 index 0000000..e6bfc36 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/EntityRelationshipsDto.md @@ -0,0 +1,40 @@ + + +# EntityRelationshipsDto + +- Namespace: `PPDS.Dataverse.Metadata.Models` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Container for all relationship types for an entity. + +## Members + +### Properties + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets the entity logical name. + +#### ManyToMany + +`List ManyToMany { get; set; }` + +Gets the many-to-many relationships. + +#### ManyToOne + +`List ManyToOne { get; set; }` + +Gets the many-to-one relationships where this entity is the related (referencing) entity. + +#### OneToMany + +`List OneToMany { get; set; }` + +Gets the one-to-many relationships where this entity is the primary (referenced) entity. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/EntitySummary.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/EntitySummary.md new file mode 100644 index 0000000..2680418 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/EntitySummary.md @@ -0,0 +1,82 @@ + + +# EntitySummary + +- Namespace: `PPDS.Dataverse.Metadata.Models` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Summary information for an entity in list views. + +## Members + +### Properties + +#### Description + +`string Description { get; set; }` + +Gets the description of the entity. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets the entity display name. + +#### EntitySetName + +`string EntitySetName { get; set; }` + +Gets the entity set name (for Web API). + +#### IsCustomEntity + +`bool IsCustomEntity { get; set; }` + +Gets whether this is a custom entity. + +#### IsManaged + +`bool IsManaged { get; set; }` + +Gets whether this entity is part of a managed solution. + +#### LogicalCollectionName + +`string LogicalCollectionName { get; set; }` + +Gets the logical collection name. + +#### LogicalName + +`string LogicalName { get; set; }` + +Gets the entity logical name. + +#### MetadataId + +`Guid MetadataId { get; set; }` + +Gets the entity metadata ID (used to match solutioncomponent.objectId for entity-type components). + +#### ObjectTypeCode + +`int ObjectTypeCode { get; set; }` + +Gets the entity type code. + +#### OwnershipType + +`string OwnershipType { get; set; }` + +Gets the ownership type (UserOwned, OrganizationOwned, None). + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets the entity schema name. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/ManyToManyRelationshipDto.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/ManyToManyRelationshipDto.md new file mode 100644 index 0000000..934040c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/ManyToManyRelationshipDto.md @@ -0,0 +1,94 @@ + + +# ManyToManyRelationshipDto + +- Namespace: `PPDS.Dataverse.Metadata.Models` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Represents a many-to-many relationship. + +## Members + +### Properties + +#### Entity1IntersectAttribute + +`string Entity1IntersectAttribute { get; set; }` + +Gets the first entity intersect attribute. + +#### Entity1LogicalName + +`string Entity1LogicalName { get; set; }` + +Gets the first entity logical name. + +#### Entity1NavigationPropertyName + +`string Entity1NavigationPropertyName { get; set; }` + +Gets the first entity navigation property name. + +#### Entity2IntersectAttribute + +`string Entity2IntersectAttribute { get; set; }` + +Gets the second entity intersect attribute. + +#### Entity2LogicalName + +`string Entity2LogicalName { get; set; }` + +Gets the second entity logical name. + +#### Entity2NavigationPropertyName + +`string Entity2NavigationPropertyName { get; set; }` + +Gets the second entity navigation property name. + +#### IntersectEntityName + +`string IntersectEntityName { get; set; }` + +Gets the intersect entity logical name. + +#### IsCustomRelationship + +`bool IsCustomRelationship { get; set; }` + +Gets whether this is a custom relationship. + +#### IsManaged + +`bool IsManaged { get; set; }` + +Gets whether this relationship is part of a managed solution. + +#### IsReflexive + +`bool IsReflexive { get; set; }` + +Gets whether this is a reflexive (self-referencing) relationship. + +#### MetadataId + +`Guid MetadataId { get; set; }` + +Gets the unique metadata identifier. + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets the schema name of the relationship. + +#### SecurityTypes + +`string SecurityTypes { get; set; }` + +Gets the security types for this relationship. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/OptionSetMetadataDto.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/OptionSetMetadataDto.md new file mode 100644 index 0000000..dc91eeb --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/OptionSetMetadataDto.md @@ -0,0 +1,76 @@ + + +# OptionSetMetadataDto + +- Namespace: `PPDS.Dataverse.Metadata.Models` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Full option set metadata including all values. + +## Members + +### Properties + +#### Description + +`string Description { get; set; }` + +Gets the description of the option set. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets the option set display name. + +#### ExternalTypeName + +`string ExternalTypeName { get; set; }` + +Gets the external type name for virtual entity integration. + +#### IsCustomOptionSet + +`bool IsCustomOptionSet { get; set; }` + +Gets whether this option set is custom. + +#### IsGlobal + +`bool IsGlobal { get; set; }` + +Gets whether this option set is global. + +#### IsManaged + +`bool IsManaged { get; set; }` + +Gets whether this option set is part of a managed solution. + +#### MetadataId + +`Guid MetadataId { get; set; }` + +Gets the unique metadata identifier. + +#### Name + +`string Name { get; set; }` + +Gets the option set name. + +#### OptionSetType + +`string OptionSetType { get; set; }` + +Gets the option set type (Picklist, State, Status, Boolean). + +#### Options + +`List Options { get; set; }` + +Gets the option values. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/OptionSetSummary.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/OptionSetSummary.md new file mode 100644 index 0000000..bb9b80b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/OptionSetSummary.md @@ -0,0 +1,70 @@ + + +# OptionSetSummary + +- Namespace: `PPDS.Dataverse.Metadata.Models` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Summary information for a global option set in list views. + +## Members + +### Properties + +#### Description + +`string Description { get; set; }` + +Gets the description of the option set. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets the option set display name. + +#### IsCustomOptionSet + +`bool IsCustomOptionSet { get; set; }` + +Gets whether this option set is custom. + +#### IsGlobal + +`bool IsGlobal { get; set; }` + +Gets whether this option set is global. + +#### IsManaged + +`bool IsManaged { get; set; }` + +Gets whether this option set is part of a managed solution. + +#### MetadataId + +`Guid MetadataId { get; set; }` + +Gets the unique metadata identifier. + +#### Name + +`string Name { get; set; }` + +Gets the option set name. + +#### OptionCount + +`int OptionCount { get; set; }` + +Gets the number of options in the set. + +#### OptionSetType + +`string OptionSetType { get; set; }` + +Gets the option set type (Picklist, State, Status, Boolean). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/OptionValueDto.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/OptionValueDto.md new file mode 100644 index 0000000..1b5341b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/OptionValueDto.md @@ -0,0 +1,70 @@ + + +# OptionValueDto + +- Namespace: `PPDS.Dataverse.Metadata.Models` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Represents a single option value in an option set. + +## Members + +### Properties + +#### Color + +`string Color { get; set; }` + +Gets the color associated with the option (for status options). + +#### Description + +`string Description { get; set; }` + +Gets the description of the option. + +#### ExternalValue + +`string ExternalValue { get; set; }` + +Gets the external value for integration scenarios. + +#### IsDefault + +`bool IsDefault { get; set; }` + +Gets whether this option is the default value. + +#### IsManaged + +`bool IsManaged { get; set; }` + +Gets whether this option is part of a managed solution. + +#### Label + +`string Label { get; set; }` + +Gets the display label of the option. + +#### ParentValue + +`Nullable ParentValue { get; set; }` + +Gets the parent value for dependent option sets (status linked to state). + +#### State + +`Nullable State { get; set; }` + +Gets the state (0=Active, 1=Inactive) for status options. + +#### Value + +`int Value { get; set; }` + +Gets the numeric value of the option. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/PrivilegeDto.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/PrivilegeDto.md new file mode 100644 index 0000000..8fda3a4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/PrivilegeDto.md @@ -0,0 +1,58 @@ + + +# PrivilegeDto + +- Namespace: `PPDS.Dataverse.Metadata.Models` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Represents a security privilege for an entity. + +## Members + +### Properties + +#### CanBeBasic + +`bool CanBeBasic { get; set; }` + +Gets whether the privilege can have a basic scope. + +#### CanBeDeep + +`bool CanBeDeep { get; set; }` + +Gets whether the privilege can have a deep scope. + +#### CanBeGlobal + +`bool CanBeGlobal { get; set; }` + +Gets whether the privilege can have a global scope. + +#### CanBeLocal + +`bool CanBeLocal { get; set; }` + +Gets whether the privilege can have a local scope. + +#### Name + +`string Name { get; set; }` + +Gets the privilege name. + +#### PrivilegeId + +`Guid PrivilegeId { get; set; }` + +Gets the privilege ID. + +#### PrivilegeType + +`string PrivilegeType { get; set; }` + +Gets the privilege type (Create, Read, Write, Delete, Assign, Share, Append, AppendTo). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/RelationshipMetadataDto.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/RelationshipMetadataDto.md new file mode 100644 index 0000000..e9bf403 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Metadata/Models/RelationshipMetadataDto.md @@ -0,0 +1,130 @@ + + +# RelationshipMetadataDto + +- Namespace: `PPDS.Dataverse.Metadata.Models` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Represents a one-to-many or many-to-one relationship. + +## Members + +### Properties + +#### CascadeAssign + +`string CascadeAssign { get; set; }` + +Gets the cascade configuration for assign operations. + +#### CascadeDelete + +`string CascadeDelete { get; set; }` + +Gets the cascade configuration for delete operations. + +#### CascadeMerge + +`string CascadeMerge { get; set; }` + +Gets the cascade configuration for merge operations. + +#### CascadeReparent + +`string CascadeReparent { get; set; }` + +Gets the cascade configuration for reparent operations. + +#### CascadeShare + +`string CascadeShare { get; set; }` + +Gets the cascade configuration for share operations. + +#### CascadeUnshare + +`string CascadeUnshare { get; set; }` + +Gets the cascade configuration for unshare operations. + +#### IsCustomRelationship + +`bool IsCustomRelationship { get; set; }` + +Gets whether this is a custom relationship. + +#### IsHierarchical + +`bool IsHierarchical { get; set; }` + +Gets whether this is a hierarchical relationship (1:N only). + +#### IsManaged + +`bool IsManaged { get; set; }` + +Gets whether this relationship is part of a managed solution. + +#### MetadataId + +`Guid MetadataId { get; set; }` + +Gets the unique metadata identifier. + +#### ReferencedAttribute + +`string ReferencedAttribute { get; set; }` + +Gets the referenced attribute (primary key). + +#### ReferencedEntity + +`string ReferencedEntity { get; set; }` + +Gets the referenced (primary) entity logical name. + +#### ReferencedEntityNavigationPropertyName + +`string ReferencedEntityNavigationPropertyName { get; set; }` + +Gets the referenced entity navigation property name. + +#### ReferencingAttribute + +`string ReferencingAttribute { get; set; }` + +Gets the referencing attribute (foreign key/lookup). + +#### ReferencingEntity + +`string ReferencingEntity { get; set; }` + +Gets the referencing (child) entity logical name. + +#### ReferencingEntityNavigationPropertyName + +`string ReferencingEntityNavigationPropertyName { get; set; }` + +Gets the referencing entity navigation property name. + +#### RelationshipType + +`string RelationshipType { get; set; }` + +Gets the relationship type (OneToMany or ManyToOne). + +#### SchemaName + +`string SchemaName { get; set; }` + +Gets the schema name of the relationship. + +#### SecurityTypes + +`string SecurityTypes { get; set; }` + +Gets the security types for this relationship. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Models/ListResult`1.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Models/ListResult`1.md new file mode 100644 index 0000000..dc352f9 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Models/ListResult`1.md @@ -0,0 +1,41 @@ + + +# ListResult`1 + +- Namespace: `PPDS.Dataverse.Models` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Wraps a list result with metadata about the total dataset. +Implements Constitution I4: every reduction in displayed records must be visible and reversible. + +## Members + +### Properties + +#### FiltersApplied + +`IReadOnlyList FiltersApplied { get; set; }` + +Gets the list of filters that were applied (for UI display, e.g. "active only", "root roles only"). + +#### Items + +`IReadOnlyList Items { get; set; }` + +Gets the items returned by the query. + +#### TotalCount + +`int TotalCount { get; set; }` + +Gets the total number of records matching the query (before any top/page limit). + +#### WasTruncated + +`bool WasTruncated { get; set; }` + +Gets whether the result was truncated by a top/page limit. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ConnectionPoolOptions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ConnectionPoolOptions.md new file mode 100644 index 0000000..662964c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ConnectionPoolOptions.md @@ -0,0 +1,111 @@ + + +# ConnectionPoolOptions + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Configuration options for the Dataverse connection pool. + +## Members + +### Properties + +#### AcquireTimeout + +`TimeSpan AcquireTimeout { get; set; }` + +Gets or sets the maximum time to wait for a connection. +With proper pool-managed concurrency, tasks queue on the semaphore +and this timeout should rarely be hit. Set high enough to accommodate large +imports with many batches queuing for connections. +Default: 120 seconds + +#### DisableAffinityCookie + +`bool DisableAffinityCookie { get; set; }` + +Gets or sets a value indicating whether to disable the affinity cookie for load distribution. +Default: true (disabled) + +#### EnableValidation + +`bool EnableValidation { get; set; }` + +Gets or sets a value indicating whether background connection validation is enabled. +Default: true + +#### Enabled + +`bool Enabled { get; set; }` + +Gets or sets a value indicating whether connection pooling is enabled. +Default: true + +#### MaxConnectionRetries + +`int MaxConnectionRetries { get; set; }` + +Gets or sets the maximum number of retry attempts for auth/connection failures. +When a connection fails due to auth or connectivity issues, operations will retry +with a new connection up to this many times. +Default: 2 + +#### MaxIdleTime + +`TimeSpan MaxIdleTime { get; set; }` + +Gets or sets the maximum connection idle time before eviction. +Default: 5 minutes + +#### MaxLifetime + +`TimeSpan MaxLifetime { get; set; }` + +Gets or sets the maximum connection lifetime. +Set within OAuth token validity window for stable long-running scenarios. +Default: 60 minutes + +#### MaxPoolSize + +`int MaxPoolSize { get; set; }` + +Gets or sets a fixed total pool size override. +When 0 (default), uses 52 × connection count (Microsoft's per-user limit). +Set to a positive value to enforce a specific total pool size. +Default: 0 (use per-connection sizing at 52 per user). + +#### MaxRetryAfterTolerance + +`Nullable MaxRetryAfterTolerance { get; set; }` + +Gets or sets the maximum acceptable Retry-After duration before failing. +Default: null (wait indefinitely for throttle to clear). +If set, throws `PPDS.Dataverse.Resilience.ServiceProtectionException` when all connections +are throttled and the shortest wait exceeds this value. + +#### SelectionStrategy + +`ConnectionSelectionStrategy SelectionStrategy { get; set; }` + +Gets or sets the connection selection strategy. +Default: ThrottleAware + +#### ValidateOnCheckout + +`bool ValidateOnCheckout { get; set; }` + +Gets or sets a value indicating whether to validate connection health on checkout. +When true, connections are checked for IsReady, age, and validity before being returned. +Default: true + +#### ValidationInterval + +`TimeSpan ValidationInterval { get; set; }` + +Gets or sets the interval for background validation. +Default: 1 minute + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ConnectionSelectionStrategy.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ConnectionSelectionStrategy.md new file mode 100644 index 0000000..5bc4283 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ConnectionSelectionStrategy.md @@ -0,0 +1,35 @@ + + +# ConnectionSelectionStrategy + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Strategy for selecting which connection to use from the pool. + +## Members + +### Fields + +#### LeastConnections + +`ConnectionSelectionStrategy LeastConnections` + +Select connection with fewest active clients. + +#### RoundRobin + +`ConnectionSelectionStrategy RoundRobin` + +Simple rotation through connections. + +#### ThrottleAware + +`ConnectionSelectionStrategy ThrottleAware` + +Avoid throttled connections, fallback to round-robin. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ConnectionStatistics.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ConnectionStatistics.md new file mode 100644 index 0000000..b0a1d3a --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ConnectionStatistics.md @@ -0,0 +1,46 @@ + + +# ConnectionStatistics + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Statistics for a specific connection configuration. + +## Members + +### Properties + +#### ActiveConnections + +`int ActiveConnections { get; set; }` + +Gets the number of active connections. + +#### IdleConnections + +`int IdleConnections { get; set; }` + +Gets the number of idle connections. + +#### IsThrottled + +`bool IsThrottled { get; set; }` + +Gets a value indicating whether this connection is currently throttled. + +#### Name + +`string Name { get; set; }` + +Gets the connection name. + +#### RequestsServed + +`long RequestsServed { get; set; }` + +Gets the requests served by this connection. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ConnectionStringSource.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ConnectionStringSource.md new file mode 100644 index 0000000..0df5473 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ConnectionStringSource.md @@ -0,0 +1,66 @@ + + +# ConnectionStringSource + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IConnectionSource`, `IDisposable` + +## Summary + +Connection source that creates a ServiceClient from connection string configuration. +Used for backward compatibility with existing DataverseOptions configuration. + +## Members + +### Constructors + +#### ConnectionStringSource(DataverseConnection config) + +`ConnectionStringSource(DataverseConnection config)` + +Creates a new connection source from connection configuration. + +- Param `config`: The connection configuration. + + +### Methods + +#### Dispose + +`void Dispose()` + +Disposes the underlying ServiceClient if it was created. + +#### GetSeedClient + +`ServiceClient GetSeedClient()` + +Gets the seed ServiceClient for cloning. + +- Returns: An authenticated, ready-to-use ServiceClient. +The pool will clone this client to create pool members. + +#### InvalidateSeed + +`void InvalidateSeed()` + +Invalidates the cached seed client, forcing fresh authentication on next use. + + +### Properties + +#### MaxPoolSize + +`int MaxPoolSize { get; }` + +Gets the maximum number of pooled connections for this source. + +#### Name + +`string Name { get; }` + +Gets the unique name for this connection source. +Used for logging, throttle tracking, and connection selection. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/DataverseConnection.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/DataverseConnection.md new file mode 100644 index 0000000..a687022 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/DataverseConnection.md @@ -0,0 +1,135 @@ + + +# DataverseConnection + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Configuration for a Dataverse connection (Application User / Service Principal). +Multiple connections can be configured to distribute load across Application Users. + +## Members + +### Constructors + +#### DataverseConnection() + +`DataverseConnection()` + +Initializes a new instance of the `PPDS.Dataverse.Pooling.DataverseConnection` class. + +#### DataverseConnection(string name) + +`DataverseConnection(string name)` + +Initializes a new instance of the `PPDS.Dataverse.Pooling.DataverseConnection` class. + +- Param `name`: The unique name for this connection. + + +### Methods + +#### ToString + +`string ToString()` + +Returns a string representation of the connection configuration. +Credentials are intentionally excluded to prevent leakage. + + +### Properties + +#### AuthType + +`DataverseAuthType AuthType { get; set; }` + +Gets or sets the authentication type. +Default: ClientSecret + +#### CertificateStoreLocation + +`string CertificateStoreLocation { get; set; }` + +Gets or sets the certificate store location. +Default: CurrentUser + +#### CertificateStoreName + +`string CertificateStoreName { get; set; }` + +Gets or sets the certificate store name. +Default: My + +#### CertificateThumbprint + +`string CertificateThumbprint { get; set; }` + +Gets or sets the certificate thumbprint for certificate auth. + +#### ClientId + +`string ClientId { get; set; }` + +Gets or sets the Azure AD application (client) ID. +Required for all auth types. + +#### ClientSecret + +`string ClientSecret { get; set; }` + +Gets or sets the client secret. +Can be set directly, via environment variable binding, or use ClientSecretKeyVaultUri for Key Vault. + +#### ClientSecretKeyVaultUri + +`string ClientSecretKeyVaultUri { get; set; }` + +Gets or sets the Azure Key Vault secret URI for the client secret. +Highest priority for secret resolution. +Example: https://myvault.vault.azure.net/secrets/dataverse-secret + +#### LoginPrompt + +`OAuthLoginPrompt LoginPrompt { get; set; }` + +Gets or sets the OAuth login prompt behavior. +Default: Auto + +#### MaxPoolSize + +`int MaxPoolSize { get; set; }` + +Gets or sets the maximum connections to create for this configuration. +Default: 10 + +#### Name + +`string Name { get; set; }` + +Gets or sets the unique name for this connection. +Used for logging, metrics, and identifying which Application User is handling requests. + +#### RedirectUri + +`string RedirectUri { get; set; }` + +Gets or sets the OAuth redirect URI. +Required for OAuth authentication. + +#### TenantId + +`string TenantId { get; set; }` + +Gets or sets the Azure AD tenant ID. +Optional - defaults to common tenant. + +#### Url + +`string Url { get; set; }` + +Gets or sets the Dataverse environment URL. +Example: https://contoso.crm.dynamics.com + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/DataverseConnectionPool.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/DataverseConnectionPool.md new file mode 100644 index 0000000..d34b54f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/DataverseConnectionPool.md @@ -0,0 +1,198 @@ + + +# DataverseConnectionPool + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IDataverseConnectionPool`, `IAsyncDisposable`, `IDisposable` + +## Summary + +High-performance connection pool for Dataverse with multi-connection support. + +## Members + +### Constructors + +#### DataverseConnectionPool(IEnumerable sources, IThrottleTracker throttleTracker, ConnectionPoolOptions poolOptions, ILogger logger) + +`DataverseConnectionPool(IEnumerable sources, IThrottleTracker throttleTracker, ConnectionPoolOptions poolOptions, ILogger logger)` + +Initializes a new connection pool from connection sources. + +- Param `sources`: One or more connection sources providing seed clients. +Each source's seed will be cloned to create pool members. + +- Param `throttleTracker`: Throttle tracking service. + +- Param `poolOptions`: Pool configuration options. + +- Param `logger`: Logger instance. + +#### DataverseConnectionPool(IOptions options, IThrottleTracker throttleTracker, ILogger logger) + +`DataverseConnectionPool(IOptions options, IThrottleTracker throttleTracker, ILogger logger)` + +Initializes a new connection pool from DataverseOptions configuration. +This constructor maintains backward compatibility with existing DI registration. + + +### Methods + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### DisposeAsync + +`ValueTask DisposeAsync()` + +*(inherited from `System.IAsyncDisposable.DisposeAsync`)* + +#### EnsureInitializedAsync + +`Task EnsureInitializedAsync(CancellationToken cancellationToken)` + +Ensures the pool is initialized by warming all seed connections. +Triggers authentication and DOP discovery. +Idempotent - subsequent calls are no-ops. + +- Param `cancellationToken`: Cancellation token. + +- Returns: A task that completes when initialization is done. + +#### ExecuteAsync + +`Task ExecuteAsync(OrganizationRequest request, CancellationToken cancellationToken)` + +Executes a request with automatic retry on service protection errors. +This is a convenience method that handles connection management and throttle retry internally. +The caller doesn't need to handle service protection exceptions - they are handled transparently. + +- Param `request`: The organization request to execute. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The organization response. + +#### GetActiveConnectionCount + +`int GetActiveConnectionCount(string sourceName)` + +Gets the current number of active (checked-out) connections for a source. + +- Param `sourceName`: The name of the connection source. + +- Returns: The number of currently active connections. + +#### GetClient + +`IPooledClient GetClient(DataverseClientOptions options)` + +Gets a client from the pool synchronously. + +- Param `options`: Optional per-request options (CallerId, etc.) + +- Returns: A pooled client that returns to pool on dispose. + +#### GetClientAsync + +`Task GetClientAsync(DataverseClientOptions options, string excludeConnectionName, CancellationToken cancellationToken)` + +Gets a client from the pool asynchronously. + +- Param `options`: Optional per-request options (CallerId, etc.) + +- Param `excludeConnectionName`: Optional connection name to exclude from selection (useful for retry after throttle). + +- Param `cancellationToken`: Cancellation token. + +- Returns: A pooled client that returns to pool on dispose. + +#### GetLiveSourceDop + +`int GetLiveSourceDop(string sourceName)` + +Gets the live DOP (degrees of parallelism) for a specific connection source. + +- Param `sourceName`: The name of the connection source. + +- Returns: The current recommended parallelism for this source (1-52). + +#### GetTotalRecommendedParallelism + +`int GetTotalRecommendedParallelism()` + +Gets the total recommended parallelism across all connection sources. +This is the sum of live RecommendedDegreesOfParallelism for each source. + +- Returns: The total recommended parallelism across all sources. + +#### InvalidateSeed + +`void InvalidateSeed(string connectionName)` + +Invalidates the seed client for a connection, forcing fresh authentication on next use. + +- Param `connectionName`: The name of the connection source to invalidate. + +#### RecordAuthFailure + +`void RecordAuthFailure()` + +Records an authentication failure for statistics. + +#### RecordConnectionFailure + +`void RecordConnectionFailure()` + +Records a connection failure for statistics. + +#### TryGetClientWithCapacityAsync + +`Task TryGetClientWithCapacityAsync(CancellationToken cancellationToken)` + +Tries to get a client from a source that has available DOP capacity. +Returns null if all sources are at capacity or throttled. + +- Param `cancellationToken`: Cancellation token. + +- Returns: A pooled client if capacity is available, null otherwise. + + +### Properties + +#### BatchCoordinator + +`BatchParallelismCoordinator BatchCoordinator { get; }` + +Gets the batch parallelism coordinator for coordinating concurrent bulk operations. + +#### InitializationResults + +`IReadOnlyList InitializationResults { get; }` + +Gets the results of seed initialization for each connection source. + +#### IsEnabled + +`bool IsEnabled { get; }` + +Gets a value indicating whether the pool is enabled. + +#### SourceCount + +`int SourceCount { get; }` + +Gets the number of connection sources configured in the pool. +This represents the number of Application Users/app registrations available. + +#### Statistics + +`PoolStatistics Statistics { get; }` + +Gets pool statistics and health information. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/IConnectionSource.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/IConnectionSource.md new file mode 100644 index 0000000..621db13 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/IConnectionSource.md @@ -0,0 +1,49 @@ + + +# IConnectionSource + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Interface +- Implements: `IDisposable` + +## Summary + +Provides a seed ServiceClient for the connection pool to clone. +Implementations handle specific authentication methods. + +## Members + +### Methods + +#### GetSeedClient + +`ServiceClient GetSeedClient()` + +Gets the seed ServiceClient for cloning. + +- Returns: An authenticated, ready-to-use ServiceClient. +The pool will clone this client to create pool members. + +#### InvalidateSeed + +`void InvalidateSeed()` + +Invalidates the cached seed client, forcing fresh authentication on next use. + + +### Properties + +#### MaxPoolSize + +`int MaxPoolSize { get; }` + +Gets the maximum number of pooled connections for this source. + +#### Name + +`string Name { get; }` + +Gets the unique name for this connection source. +Used for logging, throttle tracking, and connection selection. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/IDataverseConnectionPool.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/IDataverseConnectionPool.md new file mode 100644 index 0000000..c364186 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/IDataverseConnectionPool.md @@ -0,0 +1,162 @@ + + +# IDataverseConnectionPool + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Interface +- Implements: `IAsyncDisposable`, `IDisposable` + +## Summary + +Manages a pool of Dataverse connections with intelligent selection and lifecycle management. +Supports multiple connection sources for load distribution across Application Users. + +## Members + +### Methods + +#### EnsureInitializedAsync + +`Task EnsureInitializedAsync(CancellationToken cancellationToken)` + +Ensures the pool is initialized by warming all seed connections. +Triggers authentication and DOP discovery. +Idempotent - subsequent calls are no-ops. + +- Param `cancellationToken`: Cancellation token. + +- Returns: A task that completes when initialization is done. + +#### ExecuteAsync + +`Task ExecuteAsync(OrganizationRequest request, CancellationToken cancellationToken)` + +Executes a request with automatic retry on service protection errors. +This is a convenience method that handles connection management and throttle retry internally. +The caller doesn't need to handle service protection exceptions - they are handled transparently. + +- Param `request`: The organization request to execute. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The organization response. + +#### GetActiveConnectionCount + +`int GetActiveConnectionCount(string sourceName)` + +Gets the current number of active (checked-out) connections for a source. + +- Param `sourceName`: The name of the connection source. + +- Returns: The number of currently active connections. + +#### GetClient + +`IPooledClient GetClient(DataverseClientOptions options)` + +Gets a client from the pool synchronously. + +- Param `options`: Optional per-request options (CallerId, etc.) + +- Returns: A pooled client that returns to pool on dispose. + +#### GetClientAsync + +`Task GetClientAsync(DataverseClientOptions options, string excludeConnectionName, CancellationToken cancellationToken)` + +Gets a client from the pool asynchronously. + +- Param `options`: Optional per-request options (CallerId, etc.) + +- Param `excludeConnectionName`: Optional connection name to exclude from selection (useful for retry after throttle). + +- Param `cancellationToken`: Cancellation token. + +- Returns: A pooled client that returns to pool on dispose. + +#### GetLiveSourceDop + +`int GetLiveSourceDop(string sourceName)` + +Gets the live DOP (degrees of parallelism) for a specific connection source. + +- Param `sourceName`: The name of the connection source. + +- Returns: The current recommended parallelism for this source (1-52). + +#### GetTotalRecommendedParallelism + +`int GetTotalRecommendedParallelism()` + +Gets the total recommended parallelism across all connection sources. +This is the sum of live RecommendedDegreesOfParallelism for each source. + +- Returns: The total recommended parallelism across all sources. + +#### InvalidateSeed + +`void InvalidateSeed(string connectionName)` + +Invalidates the seed client for a connection, forcing fresh authentication on next use. + +- Param `connectionName`: The name of the connection source to invalidate. + +#### RecordAuthFailure + +`void RecordAuthFailure()` + +Records an authentication failure for statistics. + +#### RecordConnectionFailure + +`void RecordConnectionFailure()` + +Records a connection failure for statistics. + +#### TryGetClientWithCapacityAsync + +`Task TryGetClientWithCapacityAsync(CancellationToken cancellationToken)` + +Tries to get a client from a source that has available DOP capacity. +Returns null if all sources are at capacity or throttled. + +- Param `cancellationToken`: Cancellation token. + +- Returns: A pooled client if capacity is available, null otherwise. + + +### Properties + +#### BatchCoordinator + +`BatchParallelismCoordinator BatchCoordinator { get; }` + +Gets the batch parallelism coordinator for coordinating concurrent bulk operations. + +#### InitializationResults + +`IReadOnlyList InitializationResults { get; }` + +Gets the results of seed initialization for each connection source. + +#### IsEnabled + +`bool IsEnabled { get; }` + +Gets a value indicating whether the pool is enabled. + +#### SourceCount + +`int SourceCount { get; }` + +Gets the number of connection sources configured in the pool. +This represents the number of Application Users/app registrations available. + +#### Statistics + +`PoolStatistics Statistics { get; }` + +Gets pool statistics and health information. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/IPooledClient.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/IPooledClient.md new file mode 100644 index 0000000..1e50c7d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/IPooledClient.md @@ -0,0 +1,75 @@ + + +# IPooledClient + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Interface +- Implements: `IOrganizationServiceAsync`, `IOrganizationServiceAsync2`, `IOrganizationService`, `IDataverseClient`, `IAsyncDisposable`, `IDisposable` + +## Summary + +A client obtained from the connection pool. +Implements `System.IAsyncDisposable` and `System.IDisposable` to return the connection to the pool. + +## Members + +### Methods + +#### MarkInvalid + +`void MarkInvalid(string reason)` + +Marks this connection as invalid. It will be disposed on return instead of being pooled. +Call this when an unrecoverable error occurs (auth failure, connection failure, etc.). + +- Param `reason`: The reason for invalidation (for logging/diagnostics). + + +### Properties + +#### ConnectionId + +`Guid ConnectionId { get; }` + +Gets the unique identifier for this connection instance. + +#### ConnectionName + +`string ConnectionName { get; }` + +Gets the name of the connection configuration this client came from. +Used as a stable key for throttle tracking and rate control. + +#### CreatedAt + +`DateTime CreatedAt { get; }` + +Gets when this connection was created. + +#### DisplayName + +`string DisplayName { get; }` + +Gets a formatted display name for logging, combining identity and org name. +Format: "{ConnectionName}@{ConnectedOrgFriendlyName}" + +#### InvalidReason + +`string InvalidReason { get; }` + +Gets the reason the connection was marked invalid, if any. + +#### IsInvalid + +`bool IsInvalid { get; }` + +Gets whether this connection has been marked as invalid. +Invalid connections will be disposed instead of returned to the pool. + +#### LastUsedAt + +`DateTime LastUsedAt { get; }` + +Gets when this connection was last used. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/PoolExhaustedException.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/PoolExhaustedException.md new file mode 100644 index 0000000..8ebb0d3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/PoolExhaustedException.md @@ -0,0 +1,76 @@ + + +# PoolExhaustedException + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `TimeoutException` +- Implements: `ISerializable` + +## Summary + +Exception thrown when the connection pool is exhausted and no connection +could be acquired within the configured timeout period. + +## Members + +### Constructors + +#### PoolExhaustedException() + +`PoolExhaustedException()` + +Initializes a new instance of the `PPDS.Dataverse.Pooling.PoolExhaustedException` class. + +#### PoolExhaustedException(int activeConnections, int maxPoolSize, TimeSpan acquireTimeout) + +`PoolExhaustedException(int activeConnections, int maxPoolSize, TimeSpan acquireTimeout)` + +Initializes a new instance of the `PPDS.Dataverse.Pooling.PoolExhaustedException` class. + +- Param `activeConnections`: The number of active connections. + +- Param `maxPoolSize`: The maximum pool size. + +- Param `acquireTimeout`: The acquire timeout that was exceeded. + +#### PoolExhaustedException(string message) + +`PoolExhaustedException(string message)` + +Initializes a new instance of the `PPDS.Dataverse.Pooling.PoolExhaustedException` class. + +- Param `message`: The error message. + +#### PoolExhaustedException(string message, Exception innerException) + +`PoolExhaustedException(string message, Exception innerException)` + +Initializes a new instance of the `PPDS.Dataverse.Pooling.PoolExhaustedException` class. + +- Param `message`: The error message. + +- Param `innerException`: The inner exception. + + +### Properties + +#### AcquireTimeout + +`TimeSpan AcquireTimeout { get; }` + +Gets the acquire timeout that was exceeded. + +#### ActiveConnections + +`int ActiveConnections { get; }` + +Gets the number of active connections at the time of the exception. + +#### MaxPoolSize + +`int MaxPoolSize { get; }` + +Gets the maximum pool size configured. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/PoolStatistics.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/PoolStatistics.md new file mode 100644 index 0000000..34ae4a9 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/PoolStatistics.md @@ -0,0 +1,94 @@ + + +# PoolStatistics + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Statistics and health information for the connection pool. + +## Members + +### Properties + +#### ActiveConnections + +`int ActiveConnections { get; set; }` + +Gets the number of connections currently in use. + +#### AuthFailures + +`long AuthFailures { get; set; }` + +Gets the number of authentication failures detected. + +#### ConnectionFailures + +`long ConnectionFailures { get; set; }` + +Gets the number of connection failures detected. + +#### ConnectionStats + +`IReadOnlyDictionary ConnectionStats { get; set; }` + +Gets per-connection statistics. + +#### IdleConnections + +`int IdleConnections { get; set; }` + +Gets the number of idle connections in the pool. + +#### InvalidConnections + +`long InvalidConnections { get; set; }` + +Gets the number of connections that were invalidated due to failures. + +#### RequestsServed + +`long RequestsServed { get; set; }` + +Gets the total number of requests served by the pool. + +#### RetriesAttempted + +`long RetriesAttempted { get; set; }` + +Gets the total number of retry attempts made after throttle events. + +#### RetriesSucceeded + +`long RetriesSucceeded { get; set; }` + +Gets the number of retry attempts that succeeded. + +#### ThrottleEvents + +`long ThrottleEvents { get; set; }` + +Gets the total number of throttle events recorded. + +#### ThrottledConnections + +`int ThrottledConnections { get; set; }` + +Gets the number of connections currently throttled. + +#### TotalBackoffTime + +`TimeSpan TotalBackoffTime { get; set; }` + +Gets the total backoff time accumulated from all throttle events. + +#### TotalConnections + +`int TotalConnections { get; set; }` + +Gets the total number of connections (active + idle). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/PooledClientExtensions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/PooledClientExtensions.md new file mode 100644 index 0000000..66bfd67 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/PooledClientExtensions.md @@ -0,0 +1,65 @@ + + +# PooledClientExtensions + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Extension methods on `PPDS.Dataverse.Pooling.IPooledClient` for common Dataverse SDK operations +that wrap `Microsoft.Xrm.Sdk.OrganizationRequest`/`Microsoft.Xrm.Sdk.OrganizationResponse` pairs +into strongly-typed async helpers. + +## Members + +### Methods + +#### PublishAllXmlAsync + +`Task PublishAllXmlAsync(IPooledClient client, string environmentKey, CancellationToken cancellationToken)` + +Publishes all customizations in the environment. + +- Param `client`: The pooled client to execute the request on. + +- Param `environmentKey`: A stable key identifying the target environment (e.g., environment URL or org unique name). +Used to scope the publish lock so different environments can publish concurrently. + +- Param `cancellationToken`: Cancellation token. + +#### PublishXmlAsync + +`Task PublishXmlAsync(IPooledClient client, string parameterXml, string environmentKey, CancellationToken cancellationToken)` + +Publishes specific customizations using a PublishXml request. + +- Param `client`: The pooled client to execute the request on. + +- Param `parameterXml`: The XML describing which customizations to publish. +For example: `{id}` + +- Param `environmentKey`: A stable key identifying the target environment (e.g., environment URL or org unique name). +Used to scope the publish lock so different environments can publish concurrently. + +- Param `cancellationToken`: Cancellation token. + +#### RetrieveUnpublishedAsync + +`Task RetrieveUnpublishedAsync(IPooledClient client, string entityLogicalName, Guid id, ColumnSet columnSet, CancellationToken cancellationToken)` + +Retrieves an unpublished record from Dataverse. + +- Param `client`: The pooled client to execute the request on. + +- Param `entityLogicalName`: The logical name of the entity to retrieve. + +- Param `id`: The unique identifier of the record. + +- Param `columnSet`: The columns to retrieve. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The unpublished entity record. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/SeedFailureReason.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/SeedFailureReason.md new file mode 100644 index 0000000..ac64de4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/SeedFailureReason.md @@ -0,0 +1,47 @@ + + +# SeedFailureReason + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Categorized reasons for seed initialization failure. + +## Members + +### Fields + +#### AuthenticationFailed + +`SeedFailureReason AuthenticationFailed` + +Authentication failed (invalid credentials, expired token, etc.). + +#### ConnectionNotReady + +`SeedFailureReason ConnectionNotReady` + +Connection was established but never became ready. + +#### NetworkError + +`SeedFailureReason NetworkError` + +Network connectivity issue (DNS, timeout, firewall, etc.). + +#### ServiceError + +`SeedFailureReason ServiceError` + +The Dataverse service returned an error. + +#### Unknown + +`SeedFailureReason Unknown` + +Unknown or unclassified error. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/SeedInitializationResult.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/SeedInitializationResult.md new file mode 100644 index 0000000..a156a90 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/SeedInitializationResult.md @@ -0,0 +1,53 @@ + + +# SeedInitializationResult + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Result of initializing a seed connection for a pool source. + +## Members + +### Properties + +#### ConnectionName + +`string ConnectionName { get; set; }` + +Gets the connection source name. + +#### DiscoveredDop + +`Nullable DiscoveredDop { get; set; }` + +Gets the discovered DOP (degrees of parallelism) from the server. +Only populated when `PPDS.Dataverse.Pooling.SeedInitializationResult.Success` is true. + +#### ErrorMessage + +`string ErrorMessage { get; set; }` + +Gets the error message if initialization failed. + +#### Exception + +`Exception Exception { get; set; }` + +Gets the exception that caused the failure, if any. + +#### FailureReason + +`Nullable FailureReason { get; set; }` + +Gets the root cause category of the failure. + +#### Success + +`bool Success { get; set; }` + +Gets a value indicating whether the seed was initialized successfully. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ServiceClientSource.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ServiceClientSource.md new file mode 100644 index 0000000..5b907de --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/ServiceClientSource.md @@ -0,0 +1,71 @@ + + +# ServiceClientSource + +- Namespace: `PPDS.Dataverse.Pooling` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IConnectionSource`, `IDisposable` + +## Summary + +Connection source for pre-authenticated ServiceClients. +Use this when you have an already-authenticated client (device code, managed identity, etc.) + +## Members + +### Constructors + +#### ServiceClientSource(ServiceClient client, string name, int maxPoolSize) + +`ServiceClientSource(ServiceClient client, string name, int maxPoolSize)` + +Creates a new connection source wrapping an existing ServiceClient. + +- Param `client`: The authenticated ServiceClient to use as the seed for cloning. +Must be ready (`Microsoft.PowerPlatform.Dataverse.Client.ServiceClient.IsReady` == true). + +- Param `name`: Unique name for this connection source. Used for logging and tracking. + +- Param `maxPoolSize`: Maximum number of pooled connections from this source. Default is 10. + + +### Methods + +#### Dispose + +`void Dispose()` + +Disposes the underlying ServiceClient. + +#### GetSeedClient + +`ServiceClient GetSeedClient()` + +Gets the seed ServiceClient for cloning. + +- Returns: An authenticated, ready-to-use ServiceClient. +The pool will clone this client to create pool members. + +#### InvalidateSeed + +`void InvalidateSeed()` + +Invalidates the cached seed client, forcing fresh authentication on next use. + + +### Properties + +#### MaxPoolSize + +`int MaxPoolSize { get; }` + +Gets the maximum number of pooled connections for this source. + +#### Name + +`string Name { get; }` + +Gets the unique name for this connection source. +Used for logging, throttle tracking, and connection selection. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/Strategies/IConnectionSelectionStrategy.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/Strategies/IConnectionSelectionStrategy.md new file mode 100644 index 0000000..aa710d9 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/Strategies/IConnectionSelectionStrategy.md @@ -0,0 +1,30 @@ + + +# IConnectionSelectionStrategy + +- Namespace: `PPDS.Dataverse.Pooling.Strategies` +- Assembly: `PPDS.Dataverse` +- Kind: Interface + +## Summary + +Strategy for selecting which connection to use from the pool. + +## Members + +### Methods + +#### SelectConnection + +`string SelectConnection(IReadOnlyList connections, IThrottleTracker throttleTracker, IReadOnlyDictionary activeConnections)` + +Selects a connection based on the strategy's criteria. + +- Param `connections`: Available connection configurations. + +- Param `throttleTracker`: Throttle tracker for checking throttle state. + +- Param `activeConnections`: Number of active connections per configuration name. + +- Returns: The name of the selected connection. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/Strategies/LeastConnectionsStrategy.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/Strategies/LeastConnectionsStrategy.md new file mode 100644 index 0000000..6493a4e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/Strategies/LeastConnectionsStrategy.md @@ -0,0 +1,31 @@ + + +# LeastConnectionsStrategy + +- Namespace: `PPDS.Dataverse.Pooling.Strategies` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IConnectionSelectionStrategy` + +## Summary + +Selects the connection with the fewest active clients. + +## Members + +### Methods + +#### SelectConnection + +`string SelectConnection(IReadOnlyList connections, IThrottleTracker throttleTracker, IReadOnlyDictionary activeConnections)` + +Selects a connection based on the strategy's criteria. + +- Param `connections`: Available connection configurations. + +- Param `throttleTracker`: Throttle tracker for checking throttle state. + +- Param `activeConnections`: Number of active connections per configuration name. + +- Returns: The name of the selected connection. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/Strategies/RoundRobinStrategy.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/Strategies/RoundRobinStrategy.md new file mode 100644 index 0000000..65228b9 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/Strategies/RoundRobinStrategy.md @@ -0,0 +1,31 @@ + + +# RoundRobinStrategy + +- Namespace: `PPDS.Dataverse.Pooling.Strategies` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IConnectionSelectionStrategy` + +## Summary + +Simple round-robin rotation through available connections. + +## Members + +### Methods + +#### SelectConnection + +`string SelectConnection(IReadOnlyList connections, IThrottleTracker throttleTracker, IReadOnlyDictionary activeConnections)` + +Selects a connection based on the strategy's criteria. + +- Param `connections`: Available connection configurations. + +- Param `throttleTracker`: Throttle tracker for checking throttle state. + +- Param `activeConnections`: Number of active connections per configuration name. + +- Returns: The name of the selected connection. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/Strategies/ThrottleAwareStrategy.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/Strategies/ThrottleAwareStrategy.md new file mode 100644 index 0000000..7c382a3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Pooling/Strategies/ThrottleAwareStrategy.md @@ -0,0 +1,32 @@ + + +# ThrottleAwareStrategy + +- Namespace: `PPDS.Dataverse.Pooling.Strategies` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IConnectionSelectionStrategy` + +## Summary + +Avoids throttled connections and falls back to round-robin among available connections. +If all connections are throttled, returns the connection with shortest remaining throttle time. + +## Members + +### Methods + +#### SelectConnection + +`string SelectConnection(IReadOnlyList connections, IThrottleTracker throttleTracker, IReadOnlyDictionary activeConnections)` + +Selects a connection based on the strategy's criteria. + +- Param `connections`: Available connection configurations. + +- Param `throttleTracker`: Throttle tracker for checking throttle state. + +- Param `activeConnections`: Number of active connections per configuration name. + +- Returns: The name of the selected connection. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Progress/ProgressSnapshot.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Progress/ProgressSnapshot.md new file mode 100644 index 0000000..446cf50 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Progress/ProgressSnapshot.md @@ -0,0 +1,93 @@ + + +# ProgressSnapshot + +- Namespace: `PPDS.Dataverse.Progress` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Immutable snapshot of progress state at a point in time. + +## Members + +### Properties + +#### Elapsed + +`TimeSpan Elapsed { get; set; }` + +Gets the elapsed time since tracking started. + +#### EstimatedCompletionUtc + +`DateTime EstimatedCompletionUtc { get; }` + +Gets the estimated completion time (UTC). + +#### EstimatedRemaining + +`TimeSpan EstimatedRemaining { get; set; }` + +Gets the estimated time remaining based on overall rate. +Returns `System.TimeSpan.MaxValue` if rate is zero. + +#### Failed + +`long Failed { get; set; }` + +Gets the number of failed records. + +#### InstantRatePerSecond + +`double InstantRatePerSecond { get; set; }` + +Gets the instantaneous processing rate (records per second) based on a rolling window. +Warning: This value can fluctuate wildly in batch operations when multiple +batches complete at once. For most display purposes, use instead. + +#### OverallRatePerSecond + +`double OverallRatePerSecond { get; set; }` + +Gets the overall processing rate (records per second) since start. +This is the stable rate used for ETA calculations. Same as `PPDS.Dataverse.Progress.ProgressSnapshot.RatePerSecond`. + +#### PercentComplete + +`double PercentComplete { get; }` + +Gets the percentage complete (0-100). + +#### Processed + +`long Processed { get; }` + +Gets the total number of processed records (succeeded + failed). + +#### RatePerSecond + +`double RatePerSecond { get; }` + +Gets the processing rate (records per second) - total records divided by elapsed time. +Use this rate for display and throughput reporting. + +#### Remaining + +`long Remaining { get; }` + +Gets the remaining records to process. + +#### Succeeded + +`long Succeeded { get; set; }` + +Gets the number of successfully processed records. + +#### Total + +`long Total { get; set; }` + +Gets the total number of records to process. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Progress/ProgressTracker.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Progress/ProgressTracker.md new file mode 100644 index 0000000..0c870c5 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Progress/ProgressTracker.md @@ -0,0 +1,84 @@ + + +# ProgressTracker + +- Namespace: `PPDS.Dataverse.Progress` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Thread-safe progress tracker for bulk operations. +Provides accurate rate calculation with both overall and instantaneous rates. + +## Members + +### Constructors + +#### ProgressTracker(long totalCount, int rollingWindowSeconds) + +`ProgressTracker(long totalCount, int rollingWindowSeconds)` + +Initializes a new instance of the `PPDS.Dataverse.Progress.ProgressTracker` class. + +- Param `totalCount`: The total number of records to process. + +- Param `rollingWindowSeconds`: The duration of the rolling window for instantaneous rate calculation. +Default is 30 seconds. + + +### Methods + +#### GetSnapshot + +`ProgressSnapshot GetSnapshot()` + +Gets a snapshot of the current progress state. +This method is thread-safe. + +- Returns: An immutable snapshot of progress metrics. + +#### RecordProgress + +`void RecordProgress(int successCount, int failureCount)` + +Records progress for a batch of records. +This method is thread-safe and can be called from multiple threads. + +- Param `successCount`: Number of records that succeeded in this batch. + +- Param `failureCount`: Number of records that failed in this batch. Default is 0. + +#### Reset + +`void Reset()` + +Resets the tracker to its initial state. + + +### Properties + +#### Failed + +`long Failed { get; }` + +Gets the current count of failed records. + +#### Processed + +`long Processed { get; }` + +Gets the current count of processed records (succeeded + failed). + +#### Succeeded + +`long Succeeded { get; }` + +Gets the current count of successfully processed records. + +#### TotalCount + +`long TotalCount { get; }` + +Gets the total count of records to process. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/DmlValueCoercer.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/DmlValueCoercer.md new file mode 100644 index 0000000..7efe057 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/DmlValueCoercer.md @@ -0,0 +1,32 @@ + + +# DmlValueCoercer + +- Namespace: `PPDS.Dataverse.Query` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Coerces raw CLR values from SQL DML into Dataverse SDK-typed values +(`Microsoft.Xrm.Sdk.EntityReference` for lookups, `Microsoft.Xrm.Sdk.OptionSetValue` for choices, +`Microsoft.Xrm.Sdk.Money` for currency, etc.) using attribute metadata. + +## Members + +### Methods + +#### Coerce + +`object Coerce(object value, AttributeMetadataDto attribute)` + +Coerces `value` to the Dataverse SDK type implied by +`attribute`. Returns the input unchanged when coercion is not +possible (null input, null metadata, unsupported type). + +- Param `value`: The raw CLR value from a compiled SQL expression. + +- Param `attribute`: Target attribute metadata, or null if unknown. + +- Returns: The coerced value, or `value` unchanged. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/CompiledPredicate.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/CompiledPredicate.md new file mode 100644 index 0000000..d7d8cf2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/CompiledPredicate.md @@ -0,0 +1,14 @@ + + +# CompiledPredicate + +- Namespace: `PPDS.Dataverse.Query.Execution` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `MulticastDelegate` +- Implements: `ICloneable`, `ISerializable` + +## Summary + +Compiled predicate: evaluates against a row and returns true/false. +Produced by ExpressionCompiler.CompilePredicate from ScriptDom AST nodes. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/CompiledScalarExpression.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/CompiledScalarExpression.md new file mode 100644 index 0000000..6ec2f68 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/CompiledScalarExpression.md @@ -0,0 +1,14 @@ + + +# CompiledScalarExpression + +- Namespace: `PPDS.Dataverse.Query.Execution` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `MulticastDelegate` +- Implements: `ICloneable`, `ISerializable` + +## Summary + +Compiled scalar expression: evaluates against a row and returns a value. +Produced by ExpressionCompiler.CompileScalar from ScriptDom AST nodes. diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/CastConverter.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/CastConverter.md new file mode 100644 index 0000000..31f6d3f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/CastConverter.md @@ -0,0 +1,47 @@ + + +# CastConverter + +- Namespace: `PPDS.Dataverse.Query.Execution.Functions` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Implements T-SQL CAST/CONVERT type conversion semantics. +Supports common Dataverse types: int, bigint, decimal, float, +nvarchar, varchar, datetime, date, bit, uniqueidentifier, money. + +## Members + +### Methods + +#### Convert + +`object Convert(object value, string targetType, Nullable style)` + +Converts a value to the specified SQL type. + +- Param `value`: The value to convert. Null propagates as null. + +- Param `targetType`: The target SQL type name (case-insensitive), e.g. "int", "nvarchar(100)". + +- Param `style`: Optional CONVERT style code for datetime/string formatting. + +- Returns: The converted value, or null if the input is null. + +#### TryConvert + +`object TryConvert(object value, string targetType, Nullable style)` + +TRY_CAST / TRY_CONVERT: converts a value to the specified SQL type. +Returns NULL on failure instead of throwing. + +- Param `value`: The value to convert. Null propagates as null. + +- Param `targetType`: The target SQL type name (case-insensitive). + +- Param `style`: Optional CONVERT style code. + +- Returns: The converted value, or null if conversion fails. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/DataverseFunctions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/DataverseFunctions.md new file mode 100644 index 0000000..4aa2d89 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/DataverseFunctions.md @@ -0,0 +1,23 @@ + + +# DataverseFunctions + +- Namespace: `PPDS.Dataverse.Query.Execution.Functions` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Dataverse-specific functions evaluated client-side. +These functions are unique to the Power Platform / Dataverse ecosystem. + +## Members + +### Methods + +#### RegisterAll + +`void RegisterAll(FunctionRegistry registry)` + +Registers all Dataverse-specific functions into the given registry. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/DateFunctions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/DateFunctions.md new file mode 100644 index 0000000..37bc6a2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/DateFunctions.md @@ -0,0 +1,24 @@ + + +# DateFunctions + +- Namespace: `PPDS.Dataverse.Query.Execution.Functions` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +T-SQL date/time functions evaluated client-side. +YEAR/MONTH/DAY in GROUP BY are pushed to FetchXML dategrouping +for server-side performance; all other usages evaluate here. + +## Members + +### Methods + +#### RegisterAll + +`void RegisterAll(FunctionRegistry registry)` + +Registers all date functions into the given registry. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/ErrorFunctions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/ErrorFunctions.md new file mode 100644 index 0000000..6aeaee3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/ErrorFunctions.md @@ -0,0 +1,28 @@ + + +# ErrorFunctions + +- Namespace: `PPDS.Dataverse.Query.Execution.Functions` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +T-SQL error functions for TRY/CATCH blocks. +ERROR_MESSAGE(), ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(). +These read error state from @@ERROR_* variables in the VariableScope. + +## Members + +### Methods + +#### RegisterAll + +`void RegisterAll(FunctionRegistry registry, Func scopeAccessor)` + +Registers all error functions into the given registry. + +- Param `registry`: The function registry to register into. + +- Param `scopeAccessor`: A function that returns the current VariableScope. Called at invocation time. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/FunctionRegistry.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/FunctionRegistry.md new file mode 100644 index 0000000..fc35373 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/FunctionRegistry.md @@ -0,0 +1,47 @@ + + +# FunctionRegistry + +- Namespace: `PPDS.Dataverse.Query.Execution.Functions` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Registry of scalar functions available for expression evaluation. +Function names are case-insensitive per SQL convention. + +## Members + +### Methods + +#### CreateDefault + +`FunctionRegistry CreateDefault()` + +Creates a FunctionRegistry pre-loaded with all built-in functions. + +#### Invoke + +`object Invoke(string name, object[] args)` + +Invokes a registered function by name with the given arguments. + +- Param `name`: The function name (case-insensitive). + +- Param `args`: The evaluated argument values. + +- Returns: The function result. + +#### IsRegistered + +`bool IsRegistered(string name)` + +Returns true if a function with the given name is registered. + +#### Register + +`void Register(string name, IScalarFunction function)` + +Registers a function under the given name (case-insensitive). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/IScalarFunction.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/IScalarFunction.md new file mode 100644 index 0000000..d04ab1c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/IScalarFunction.md @@ -0,0 +1,42 @@ + + +# IScalarFunction + +- Namespace: `PPDS.Dataverse.Query.Execution.Functions` +- Assembly: `PPDS.Dataverse` +- Kind: Interface + +## Summary + +A scalar function that accepts arguments and returns a single value. +Implementations handle NULL propagation per SQL semantics. + +## Members + +### Methods + +#### Execute + +`object Execute(object[] args)` + +Execute the function with the given evaluated argument values. + +- Param `args`: The evaluated argument values (may contain nulls). + +- Returns: The function result, or null. + + +### Properties + +#### MaxArgs + +`int MaxArgs { get; }` + +Maximum number of arguments the function accepts. Use int.MaxValue for variadic. + +#### MinArgs + +`int MinArgs { get; }` + +Minimum number of arguments the function accepts. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/JsonFunctions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/JsonFunctions.md new file mode 100644 index 0000000..ac1078a --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/JsonFunctions.md @@ -0,0 +1,23 @@ + + +# JsonFunctions + +- Namespace: `PPDS.Dataverse.Query.Execution.Functions` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +T-SQL JSON functions evaluated client-side using System.Text.Json. +JSON path syntax: $.property.nested (simplified JSONPath). + +## Members + +### Methods + +#### RegisterAll + +`void RegisterAll(FunctionRegistry registry)` + +Registers all JSON functions into the given registry. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/MathFunctions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/MathFunctions.md new file mode 100644 index 0000000..d67552f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/MathFunctions.md @@ -0,0 +1,23 @@ + + +# MathFunctions + +- Namespace: `PPDS.Dataverse.Query.Execution.Functions` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +T-SQL math functions evaluated client-side. +All functions propagate NULL (return NULL if any argument is NULL). + +## Members + +### Methods + +#### RegisterAll + +`void RegisterAll(FunctionRegistry registry)` + +Registers all math functions into the given registry. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/NullFunctions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/NullFunctions.md new file mode 100644 index 0000000..72f3e8b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/NullFunctions.md @@ -0,0 +1,22 @@ + + +# NullFunctions + +- Namespace: `PPDS.Dataverse.Query.Execution.Functions` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +T-SQL null-handling functions evaluated client-side. + +## Members + +### Methods + +#### RegisterAll + +`void RegisterAll(FunctionRegistry registry)` + +Registers all null-handling functions into the given registry. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/StringFunctions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/StringFunctions.md new file mode 100644 index 0000000..2a82d60 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/Functions/StringFunctions.md @@ -0,0 +1,24 @@ + + +# StringFunctions + +- Namespace: `PPDS.Dataverse.Query.Execution.Functions` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +T-SQL string functions evaluated client-side. +All functions propagate NULL (return NULL if any argument is NULL), +except CONCAT which treats NULL as empty string. + +## Members + +### Methods + +#### RegisterAll + +`void RegisterAll(FunctionRegistry registry)` + +Registers all string functions into the given registry. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/PlanExecutor.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/PlanExecutor.md new file mode 100644 index 0000000..cb06b0e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/PlanExecutor.md @@ -0,0 +1,46 @@ + + +# PlanExecutor + +- Namespace: `PPDS.Dataverse.Query.Execution` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Executes a query plan by consuming the root node's IAsyncEnumerable +and collecting results into QueryResult format. + +## Members + +### Methods + +#### ExecuteAsync + +`Task ExecuteAsync(QueryPlanResult planResult, QueryPlanContext context, CancellationToken cancellationToken)` + +Executes a query plan and collects all results. + +- Param `planResult`: The plan to execute. + +- Param `context`: The execution context. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The collected query result. + +#### ExecuteStreamingAsync + +`IAsyncEnumerable ExecuteStreamingAsync(QueryPlanResult planResult, QueryPlanContext context, CancellationToken cancellationToken)` + +Executes a query plan and yields rows one-at-a-time as an IAsyncEnumerable, +enabling progressive streaming to the caller without buffering all rows in memory. + +- Param `planResult`: The plan to execute. + +- Param `context`: The execution context. + +- Param `cancellationToken`: Cancellation token. + +- Returns: An async stream of query rows. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/QueryErrorCode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/QueryErrorCode.md new file mode 100644 index 0000000..51dba96 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/QueryErrorCode.md @@ -0,0 +1,82 @@ + + +# QueryErrorCode + +- Namespace: `PPDS.Dataverse.Query.Execution` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Structured error codes for query execution failures. + +## Members + +### Fields + +#### AggregateLimitExceeded + +`string AggregateLimitExceeded` + +Aggregate query exceeded the Dataverse 50,000-record limit. + +#### DmlBlocked + +`string DmlBlocked` + +DML statement blocked by safety guard. + +#### DmlRowCapExceeded + +`string DmlRowCapExceeded` + +DML operation would affect more rows than the configured cap. + +#### ExecutionFailed + +`string ExecutionFailed` + +Query execution failed. + +#### MemoryLimitExceeded + +`string MemoryLimitExceeded` + +Query exceeded the in-memory working set limit. + +#### ParseError + +`string ParseError` + +SQL parse error. + +#### PlanTimeout + +`string PlanTimeout` + +Query plan generation timed out. + +#### SubqueryMultipleRows + +`string SubqueryMultipleRows` + +Scalar subquery returned more than one row. + +#### TdsConnectionFailed + +`string TdsConnectionFailed` + +TDS Endpoint connection failed (endpoint may be disabled on environment). + +#### TdsIncompatible + +`string TdsIncompatible` + +Query is incompatible with TDS Endpoint (DML, unsupported entity, unsupported feature). + +#### TypeMismatch + +`string TypeMismatch` + +Expression type mismatch (e.g., comparing string to int). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/QueryExecutionException.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/QueryExecutionException.md new file mode 100644 index 0000000..bed49d0 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/QueryExecutionException.md @@ -0,0 +1,40 @@ + + +# QueryExecutionException + +- Namespace: `PPDS.Dataverse.Query.Execution` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `InvalidOperationException` +- Implements: `ISerializable` + +## Summary + +Exception thrown during query plan execution with a structured error code. + +## Members + +### Constructors + +#### QueryExecutionException(string errorCode, string message, Exception inner) + +`QueryExecutionException(string errorCode, string message, Exception inner)` + +Creates a new query execution exception. + +- Param `errorCode`: The structured error code (use `PPDS.Dataverse.Query.Execution.QueryErrorCode` constants). + +- Param `message`: Human-readable error message. + +- Param `inner`: Optional inner exception. + + +### Properties + +#### ErrorCode + +`string ErrorCode { get; }` + +Structured error code for programmatic handling. +Uses the `Query.*` prefix (e.g., `"Query.TypeMismatch"`). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/VariableInfo.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/VariableInfo.md new file mode 100644 index 0000000..d0d0710 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/VariableInfo.md @@ -0,0 +1,50 @@ + + +# VariableInfo + +- Namespace: `PPDS.Dataverse.Query.Execution` +- Assembly: `PPDS.Dataverse` +- Kind: Record +- Implements: `IEquatable` + +## Summary + +Information about a declared SQL variable. + +## Members + +### Constructors + +#### VariableInfo(string Name, string TypeName, object Value) + +`VariableInfo(string Name, string TypeName, object Value)` + +Information about a declared SQL variable. + +- Param `Name`: The variable name including @ prefix. + +- Param `TypeName`: The declared SQL type name. + +- Param `Value`: The current value (null if not yet assigned). + + +### Properties + +#### Name + +`string Name { get; set; }` + +The variable name including @ prefix. + +#### TypeName + +`string TypeName { get; set; }` + +The declared SQL type name. + +#### Value + +`object Value { get; set; }` + +The current value (null if not yet assigned). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/VariableScope.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/VariableScope.md new file mode 100644 index 0000000..3cc8fd7 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Execution/VariableScope.md @@ -0,0 +1,65 @@ + + +# VariableScope + +- Namespace: `PPDS.Dataverse.Query.Execution` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Manages SQL variable declarations and values. +Variables are declared with DECLARE @name TYPE [= value] +and used with SET @name = expression or in WHERE clauses. + +## Members + +### Methods + +#### Declare + +`void Declare(string name, string typeName, object initialValue)` + +Declares a variable with a type and optional initial value. + +- Param `name`: Variable name (must start with @). + +- Param `typeName`: The SQL type name. + +- Param `initialValue`: Optional initial value. + +#### Get + +`object Get(string name)` + +Gets the current value of a declared variable. + +- Param `name`: Variable name. + +- Returns: The variable's current value. + +#### IsDeclared + +`bool IsDeclared(string name)` + +Checks whether a variable has been declared. + +#### Set + +`void Set(string name, object value)` + +Sets the value of a previously declared variable. + +- Param `name`: Variable name (must have been declared). + +- Param `value`: The new value. + + +### Properties + +#### Variables + +`IReadOnlyDictionary Variables { get; }` + +Gets all declared variables (read-only view). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/IQueryExecutor.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/IQueryExecutor.md new file mode 100644 index 0000000..aa10f99 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/IQueryExecutor.md @@ -0,0 +1,82 @@ + + +# IQueryExecutor + +- Namespace: `PPDS.Dataverse.Query` +- Assembly: `PPDS.Dataverse` +- Kind: Interface + +## Summary + +Executes FetchXML queries against Dataverse and returns structured results. + +## Members + +### Methods + +#### ExecuteFetchXmlAllPagesAsync + +`Task ExecuteFetchXmlAllPagesAsync(string fetchXml, int maxRecords, CancellationToken cancellationToken)` + +Executes a FetchXML query with automatic paging, returning all results. +Use with caution for large result sets. + +- Param `fetchXml`: The FetchXML query to execute. + +- Param `maxRecords`: Maximum total records to retrieve. Default is 5000. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The query result containing all records up to maxRecords. + +#### ExecuteFetchXmlAsync + +`Task ExecuteFetchXmlAsync(string fetchXml, Nullable pageNumber, string pagingCookie, bool includeCount, CancellationToken cancellationToken)` + +Executes a FetchXML query and returns the results. + +- Param `fetchXml`: The FetchXML query to execute. + +- Param `pageNumber`: Optional page number for paging (1-based). If null, uses page 1. + +- Param `pagingCookie`: Optional paging cookie from a previous query result for continuation. + +- Param `includeCount`: Whether to include the total record count in the result. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The query result containing records, columns, and paging information. + +#### ExecuteFetchXmlAsync + +`Task ExecuteFetchXmlAsync(string fetchXml, Nullable pageNumber, string pagingCookie, bool includeCount, QueryExecutionOptions executionOptions, CancellationToken cancellationToken)` + +Executes a FetchXML query with optional execution options (bypass plugins/flows). +Default implementation ignores execution options and delegates to the base overload. +Override in concrete classes to apply `PPDS.Dataverse.Query.QueryExecutionOptions`. + +#### GetMinMaxCreatedOnAsync + +`Task, Nullable>> GetMinMaxCreatedOnAsync(string entityLogicalName, CancellationToken cancellationToken)` + +Gets the min and max createdon dates for an entity, used for aggregate partitioning. + +- Param `entityLogicalName`: The logical name of the entity. + +- Param `cancellationToken`: Cancellation token. + +- Returns: A tuple of (Min, Max) DateTime values, or (null, null) if not available. + +#### GetTotalRecordCountAsync + +`Task> GetTotalRecordCountAsync(string entityLogicalName, CancellationToken cancellationToken)` + +Gets the total record count for an entity using RetrieveTotalRecordCountRequest. +This is a near-instant metadata read, not a full table scan. + +- Param `entityLogicalName`: The logical name of the entity to count. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The total count, or null if not supported for this entity. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/ITdsQueryExecutor.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/ITdsQueryExecutor.md new file mode 100644 index 0000000..14faf58 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/ITdsQueryExecutor.md @@ -0,0 +1,31 @@ + + +# ITdsQueryExecutor + +- Namespace: `PPDS.Dataverse.Query` +- Assembly: `PPDS.Dataverse` +- Kind: Interface + +## Summary + +Executes SQL queries against Dataverse's TDS Endpoint (read-only replica) +using the SQL Server wire protocol on port 5558. + +## Members + +### Methods + +#### ExecuteSqlAsync + +`Task ExecuteSqlAsync(string sql, Nullable maxRows, CancellationToken cancellationToken)` + +Executes a SQL query against the Dataverse TDS Endpoint and returns structured results. + +- Param `sql`: The SQL SELECT query to execute. + +- Param `maxRows`: Optional maximum number of rows to return. If null, returns all rows. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The query result containing records, columns, and execution metadata. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/IQueryPlanNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/IQueryPlanNode.md new file mode 100644 index 0000000..af7d241 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/IQueryPlanNode.md @@ -0,0 +1,44 @@ + + +# IQueryPlanNode + +- Namespace: `PPDS.Dataverse.Query.Planning` +- Assembly: `PPDS.Dataverse` +- Kind: Interface + +## Summary + +A node in the query execution plan tree (Volcano/iterator model). +Each node produces rows lazily via IAsyncEnumerable. + +## Members + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/IQueryProgressReporter.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/IQueryProgressReporter.md new file mode 100644 index 0000000..d314bcf --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/IQueryProgressReporter.md @@ -0,0 +1,40 @@ + + +# IQueryProgressReporter + +- Namespace: `PPDS.Dataverse.Query.Planning` +- Assembly: `PPDS.Dataverse` +- Kind: Interface + +## Summary + +Lightweight progress reporter for query plan execution. +Defined in the Dataverse layer so it can be used without depending on PPDS.Cli. +The CLI's `IProgressReporter` can wrap/adapt this interface. + +## Members + +### Methods + +#### ReportPhase + +`void ReportPhase(string phase, string detail)` + +Reports a phase change during execution (e.g., "Fetching pages", "Merging results"). + +- Param `phase`: The current phase name. + +- Param `detail`: Optional detail about the phase. + +#### ReportProgress + +`void ReportProgress(int currentItem, int totalItems, string statusMessage)` + +Reports item-level progress during execution. + +- Param `currentItem`: The current item number (1-based). + +- Param `totalItems`: The total number of items, or 0 if unknown. + +- Param `statusMessage`: Optional status message. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/NodeStatistics.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/NodeStatistics.md new file mode 100644 index 0000000..a68a70b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/NodeStatistics.md @@ -0,0 +1,49 @@ + + +# NodeStatistics + +- Namespace: `PPDS.Dataverse.Query.Planning` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Statistics for a single plan node. Thread-safe via Interlocked operations. + +## Members + +### Methods + +#### AddRowsProduced + +`void AddRowsProduced(long count)` + +Adds `count` to `PPDS.Dataverse.Query.Planning.NodeStatistics.RowsProduced`. + +#### AddTimeMs + +`void AddTimeMs(long ms)` + +Adds `ms` to `PPDS.Dataverse.Query.Planning.NodeStatistics.TimeMs`. + +#### IncrementRowsProduced + +`void IncrementRowsProduced()` + +Increments `PPDS.Dataverse.Query.Planning.NodeStatistics.RowsProduced` by one. + + +### Properties + +#### RowsProduced + +`long RowsProduced { get; }` + +Rows produced by this node. + +#### TimeMs + +`long TimeMs { get; }` + +Time spent in this node (ms). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/AdaptiveAggregateScanNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/AdaptiveAggregateScanNode.md new file mode 100644 index 0000000..88c9b6d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/AdaptiveAggregateScanNode.md @@ -0,0 +1,95 @@ + + +# AdaptiveAggregateScanNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Wraps a FetchXML aggregate scan with adaptive retry. When the Dataverse +50K AggregateQueryRecordLimit is hit, splits the date range in half and +retries both halves recursively. Guarantees convergence for any data +distribution. + +## Members + +### Constructors + +#### AdaptiveAggregateScanNode(string templateFetchXml, string entityLogicalName, DateTime rangeStart, DateTime rangeEnd, int depth) + +`AdaptiveAggregateScanNode(string templateFetchXml, string entityLogicalName, DateTime rangeStart, DateTime rangeEnd, int depth)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.AdaptiveAggregateScanNode` class. + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Depth + +`int Depth { get; }` + +Current recursion depth (0 = original partition). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EntityLogicalName + +`string EntityLogicalName { get; }` + +The entity logical name being queried. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### RangeEnd + +`DateTime RangeEnd { get; }` + +Exclusive end of this partition's date range. + +#### RangeStart + +`DateTime RangeStart { get; }` + +Inclusive start of this partition's date range. + +#### TemplateFetchXml + +`string TemplateFetchXml { get; }` + +The template FetchXML (without date range filter). + + +### Fields + +#### MaxDepth + +`int MaxDepth` + +Maximum recursion depth to prevent infinite splitting. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/AggregateFunction.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/AggregateFunction.md new file mode 100644 index 0000000..0baa2c3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/AggregateFunction.md @@ -0,0 +1,80 @@ + + +# AggregateFunction + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Aggregate functions supported by MergeAggregateNode. +Note: COUNT(DISTINCT) is NOT supported for parallel partitioning because +summing partial distinct counts would double-count values appearing in +multiple partitions. Use a single-partition approach for COUNT(DISTINCT). + +## Members + +### Fields + +#### Avg + +`AggregateFunction Avg` + +Computes the average of values. + +#### Count + +`AggregateFunction Count` + +Counts the number of rows. + +#### Max + +`AggregateFunction Max` + +Finds the maximum value. + +#### Min + +`AggregateFunction Min` + +Finds the minimum value. + +#### Stdev + +`AggregateFunction Stdev` + +Computes standard deviation (client-side). + +#### StdevP + +`AggregateFunction StdevP` + +Computes population standard deviation (client-side). + +#### StringAgg + +`AggregateFunction StringAgg` + +Concatenates values with separator (client-side). + +#### Sum + +`AggregateFunction Sum` + +Computes the sum of values. + +#### Var + +`AggregateFunction Var` + +Computes variance (client-side). + +#### VarP + +`AggregateFunction VarP` + +Computes population variance (client-side). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientAggregateColumn.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientAggregateColumn.md new file mode 100644 index 0000000..6536703 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientAggregateColumn.md @@ -0,0 +1,43 @@ + + +# ClientAggregateColumn + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Describes an aggregate column for client-side computation. + +## Members + +### Constructors + +#### ClientAggregateColumn(string sourceColumn, string outputAlias, ClientAggregateFunction function) + +`ClientAggregateColumn(string sourceColumn, string outputAlias, ClientAggregateFunction function)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.ClientAggregateColumn` class. + + +### Properties + +#### Function + +`ClientAggregateFunction Function { get; }` + +The aggregate function to compute. + +#### OutputAlias + +`string OutputAlias { get; }` + +The output alias for the aggregate result. + +#### SourceColumn + +`string SourceColumn { get; }` + +The source column name to aggregate. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientAggregateFunction.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientAggregateFunction.md new file mode 100644 index 0000000..ebdcb1c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientAggregateFunction.md @@ -0,0 +1,71 @@ + + +# ClientAggregateFunction + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Aggregate functions supported by ClientAggregateNode. + +## Members + +### Fields + +#### Avg + +`ClientAggregateFunction Avg` + +AVG aggregate. + +#### Count + +`ClientAggregateFunction Count` + +COUNT aggregate. + +#### Max + +`ClientAggregateFunction Max` + +MAX aggregate. + +#### Min + +`ClientAggregateFunction Min` + +MIN aggregate. + +#### Stdev + +`ClientAggregateFunction Stdev` + +STDEV (sample standard deviation) aggregate. + +#### StdevP + +`ClientAggregateFunction StdevP` + +STDEVP (population standard deviation) aggregate. + +#### Sum + +`ClientAggregateFunction Sum` + +SUM aggregate. + +#### Var + +`ClientAggregateFunction Var` + +VAR (sample variance) aggregate. + +#### VarP + +`ClientAggregateFunction VarP` + +VARP (population variance) aggregate. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientAggregateNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientAggregateNode.md new file mode 100644 index 0000000..b7bfde7 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientAggregateNode.md @@ -0,0 +1,73 @@ + + +# ClientAggregateNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Computes aggregate functions client-side from raw (non-aggregated) input rows. +Used for aggregates that FetchXML doesn't support natively (STDEV, VAR). +Collects all input rows, groups them if needed, and computes the aggregates. + +## Members + +### Constructors + +#### ClientAggregateNode(IQueryPlanNode input, IReadOnlyList aggregateColumns, IReadOnlyList groupByColumns) + +`ClientAggregateNode(IQueryPlanNode input, IReadOnlyList aggregateColumns, IReadOnlyList groupByColumns)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.ClientAggregateNode` class. + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### AggregateColumns + +`IReadOnlyList AggregateColumns { get; }` + +The aggregate columns to compute. + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### GroupByColumns + +`IReadOnlyList GroupByColumns { get; }` + +Column names to group by. + +#### Input + +`IQueryPlanNode Input { get; }` + +The child node providing raw data rows. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientFilterNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientFilterNode.md new file mode 100644 index 0000000..8db830f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientFilterNode.md @@ -0,0 +1,72 @@ + + +# ClientFilterNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Filters rows by evaluating a condition client-side. +Used for HAVING clauses and expressions that can't be pushed to FetchXML. + +## Members + +### Constructors + +#### ClientFilterNode(IQueryPlanNode input, CompiledPredicate predicate, string predicateDescription) + +`ClientFilterNode(IQueryPlanNode input, CompiledPredicate predicate, string predicateDescription)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.ClientFilterNode` class. + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### Input + +`IQueryPlanNode Input { get; }` + +The child node that produces input rows. + +#### Predicate + +`CompiledPredicate Predicate { get; }` + +The compiled predicate to evaluate against each row. + +#### PredicateDescription + +`string PredicateDescription { get; }` + +Human-readable description of the predicate for EXPLAIN output. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientWindowNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientWindowNode.md new file mode 100644 index 0000000..63b4d86 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ClientWindowNode.md @@ -0,0 +1,73 @@ + + +# ClientWindowNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Computes window functions (ROW_NUMBER, RANK, DENSE_RANK, aggregate OVER) client-side. +Materializes all input rows, partitions them, sorts within partitions, and computes +window function values. All rows are emitted with additional window columns added. + +## Members + +### Constructors + +#### ClientWindowNode(IQueryPlanNode input, IReadOnlyList windows, int maxMaterializationRows) + +`ClientWindowNode(IQueryPlanNode input, IReadOnlyList windows, int maxMaterializationRows)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.ClientWindowNode` class. + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### Input + +`IQueryPlanNode Input { get; }` + +The child node that produces input rows. + +#### MaxMaterializationRows + +`int MaxMaterializationRows { get; }` + +Maximum rows to materialize before throwing. 0 = unlimited. + +#### Windows + +`IReadOnlyList Windows { get; }` + +The window function definitions to compute. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/CompiledOrderByItem.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/CompiledOrderByItem.md new file mode 100644 index 0000000..e19c0f4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/CompiledOrderByItem.md @@ -0,0 +1,25 @@ + + +# CompiledOrderByItem + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Record +- Implements: `IEquatable` + +## Summary + +A compiled ORDER BY item used by window functions. Contains the column name for +value lookup, a compiled expression for evaluation, and the sort direction. + +## Members + +### Constructors + +#### CompiledOrderByItem(string ColumnName, CompiledScalarExpression Value, bool Descending) + +`CompiledOrderByItem(string ColumnName, CompiledScalarExpression Value, bool Descending)` + +A compiled ORDER BY item used by window functions. Contains the column name for +value lookup, a compiled expression for evaluation, and the sort direction. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/CompiledSetClause.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/CompiledSetClause.md new file mode 100644 index 0000000..869e2f8 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/CompiledSetClause.md @@ -0,0 +1,23 @@ + + +# CompiledSetClause + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Record +- Implements: `IEquatable` + +## Summary + +A compiled SET clause for UPDATE statements. + +## Members + +### Constructors + +#### CompiledSetClause(string ColumnName, CompiledScalarExpression Value) + +`CompiledSetClause(string ColumnName, CompiledScalarExpression Value)` + +A compiled SET clause for UPDATE statements. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ConcatenateNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ConcatenateNode.md new file mode 100644 index 0000000..42a5bae --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ConcatenateNode.md @@ -0,0 +1,60 @@ + + +# ConcatenateNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Concatenates rows from multiple child nodes sequentially. +Used for UNION ALL — yields all rows from child 1, then child 2, etc. + +## Members + +### Constructors + +#### ConcatenateNode(IReadOnlyList inputs) + +`ConcatenateNode(IReadOnlyList inputs)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.ConcatenateNode` class. + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### Inputs + +`IReadOnlyList Inputs { get; }` + +The child nodes whose rows are concatenated. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/DistinctNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/DistinctNode.md new file mode 100644 index 0000000..bbf6589 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/DistinctNode.md @@ -0,0 +1,60 @@ + + +# DistinctNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Deduplicates rows from a single input using a composite key hash set. +Used for UNION (without ALL) to remove duplicate rows across branches. + +## Members + +### Constructors + +#### DistinctNode(IQueryPlanNode input) + +`DistinctNode(IQueryPlanNode input)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.DistinctNode` class. + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### Input + +`IQueryPlanNode Input { get; }` + +The child node that produces input rows. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/DmlExecuteNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/DmlExecuteNode.md new file mode 100644 index 0000000..da2a304 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/DmlExecuteNode.md @@ -0,0 +1,117 @@ + + +# DmlExecuteNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Executes DML operations (INSERT, UPDATE, DELETE) using BulkOperationExecutor. +Returns a single row with the affected row count. + +## Members + +### Methods + +#### Delete + +`DmlExecuteNode Delete(string entityLogicalName, IQueryPlanNode sourceNode, int rowCap)` + +Creates a DmlExecuteNode for DELETE. + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + +#### InsertSelect + +`DmlExecuteNode InsertSelect(string entityLogicalName, IReadOnlyList columns, IQueryPlanNode sourceNode, IReadOnlyList sourceColumns, int rowCap)` + +Creates a DmlExecuteNode for INSERT SELECT. + +#### InsertValues + +`DmlExecuteNode InsertValues(string entityLogicalName, IReadOnlyList columns, IReadOnlyList> valueRows, int rowCap)` + +Creates a DmlExecuteNode for INSERT VALUES. + +#### Update + +`DmlExecuteNode Update(string entityLogicalName, IQueryPlanNode sourceNode, IReadOnlyList setClauses, int rowCap)` + +Creates a DmlExecuteNode for UPDATE. + + +### Properties + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EntityLogicalName + +`string EntityLogicalName { get; }` + +The target entity logical name. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### InsertColumns + +`IReadOnlyList InsertColumns { get; }` + +Column names for INSERT statements. + +#### InsertValueRows + +`IReadOnlyList> InsertValueRows { get; }` + +Value rows for INSERT VALUES statements (compiled delegates). + +#### Operation + +`DmlOperation Operation { get; }` + +The type of DML operation. + +#### RowCap + +`int RowCap { get; }` + +Row cap from DML safety guard. + +#### SetClauses + +`IReadOnlyList SetClauses { get; }` + +SET clauses for UPDATE statements (compiled delegates). + +#### SourceColumns + +`IReadOnlyList SourceColumns { get; }` + +Source column names for INSERT...SELECT ordinal mapping. + +#### SourceNode + +`IQueryPlanNode SourceNode { get; }` + +Source node that produces rows (for INSERT...SELECT, UPDATE, DELETE). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/DmlOperation.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/DmlOperation.md new file mode 100644 index 0000000..96c5829 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/DmlOperation.md @@ -0,0 +1,35 @@ + + +# DmlOperation + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +The type of DML operation. + +## Members + +### Fields + +#### Delete + +`DmlOperation Delete` + +DELETE operation. + +#### Insert + +`DmlOperation Insert` + +INSERT operation. + +#### Update + +`DmlOperation Update` + +UPDATE operation. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/FetchXmlScanNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/FetchXmlScanNode.md new file mode 100644 index 0000000..00357b3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/FetchXmlScanNode.md @@ -0,0 +1,134 @@ + + +# FetchXmlScanNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Executes a FetchXML query and yields rows page-by-page. +Leaf node in the execution plan tree. + +## Members + +### Constructors + +#### FetchXmlScanNode(string fetchXml, string entityLogicalName, bool autoPage, Nullable maxRows, Nullable initialPageNumber, string initialPagingCookie, bool includeCount, bool noLock) + +`FetchXmlScanNode(string fetchXml, string entityLogicalName, bool autoPage, Nullable maxRows, Nullable initialPageNumber, string initialPagingCookie, bool includeCount, bool noLock)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.FetchXmlScanNode` class. + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + +#### SetLastParentId + +`void SetLastParentId(Guid parentId)` + +Records the primary key of the last parent record on the current page. +Called at the end of each page when `PPDS.Dataverse.Query.Planning.Nodes.FetchXmlScanNode.HasLinkedEntity` is true +to enable boundary split detection on the next page. + +- Param `parentId`: The primary key of the last parent record on the current page. + +#### ShouldMergeWithPreviousPage + +`bool ShouldMergeWithPreviousPage(Guid firstParentId)` + +Determines whether the first record on a new page should be merged with the +last parent from the previous page, rather than treated as a new parent. +This occurs when a parent record's child rows span a page boundary. + +- Param `firstParentId`: The primary key of the first parent record on the new page. + +- Returns: `true` if the record is a continuation of a parent from the previous page + and its child records should be merged; `false` otherwise. + + +### Properties + +#### AutoPage + +`bool AutoPage { get; }` + +If true, automatically fetch all pages. If false, single page only. + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EntityLogicalName + +`string EntityLogicalName { get; }` + +The entity logical name being queried. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### FetchXml + +`string FetchXml { get; }` + +The FetchXML query to execute. + +#### HasLinkedEntity + +`bool HasLinkedEntity { get; }` + +Indicates whether the FetchXML query contains link-entity elements. +When true, pagination may split a parent record's children across page boundaries, +requiring merge logic to avoid duplicate parents with incomplete child sets. + +#### IncludeCount + +`bool IncludeCount { get; }` + +Whether to request total record count from Dataverse. + +#### InitialPageNumber + +`Nullable InitialPageNumber { get; }` + +Starting page number for caller-controlled paging (1-based). +When set with `PPDS.Dataverse.Query.Planning.Nodes.FetchXmlScanNode.AutoPage` = false, fetches only this page. + +#### InitialPagingCookie + +`string InitialPagingCookie { get; }` + +Paging cookie for caller-controlled paging continuation. + +#### MaxRows + +`Nullable MaxRows { get; }` + +Maximum rows to return, if any. + +#### NoLock + +`bool NoLock { get; }` + +Whether to inject no-lock="true" into the FetchXML before execution. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/MergeAggregateColumn.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/MergeAggregateColumn.md new file mode 100644 index 0000000..d0910d5 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/MergeAggregateColumn.md @@ -0,0 +1,49 @@ + + +# MergeAggregateColumn + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Describes an aggregate column to be merged. + +## Members + +### Constructors + +#### MergeAggregateColumn(string alias, AggregateFunction function, string countAlias, string separator) + +`MergeAggregateColumn(string alias, AggregateFunction function, string countAlias, string separator)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.MergeAggregateColumn` class. + + +### Properties + +#### Alias + +`string Alias { get; }` + +The output alias for this aggregate column. + +#### CountAlias + +`string CountAlias { get; }` + +For AVG merging, the alias of the companion COUNT column. Null if not tracking. + +#### Function + +`AggregateFunction Function { get; }` + +The aggregate function to apply when merging partitions. + +#### Separator + +`string Separator { get; }` + +For STRING_AGG, the separator string. Defaults to ",". + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/MergeAggregateNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/MergeAggregateNode.md new file mode 100644 index 0000000..c8922b2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/MergeAggregateNode.md @@ -0,0 +1,78 @@ + + +# MergeAggregateNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Merges partial aggregate results from parallel partitions. +Handles COUNT (sum), SUM (sum), AVG (weighted), MIN, MAX. + +NOTE: COUNT(DISTINCT) cannot be parallel-partitioned because summing +partial distinct counts would double-count values that appear in +multiple partitions. COUNT(DISTINCT) must be handled by a single +aggregate query or a different strategy (e.g., client-side DISTINCT +followed by COUNT). + +## Members + +### Constructors + +#### MergeAggregateNode(IQueryPlanNode input, IReadOnlyList aggregateColumns, IReadOnlyList groupByColumns) + +`MergeAggregateNode(IQueryPlanNode input, IReadOnlyList aggregateColumns, IReadOnlyList groupByColumns)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.MergeAggregateNode` class. + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### AggregateColumns + +`IReadOnlyList AggregateColumns { get; }` + +The aggregate columns to merge across partitions. + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### GroupByColumns + +`IReadOnlyList GroupByColumns { get; }` + +The column names used for grouping aggregated results. + +#### Input + +`IQueryPlanNode Input { get; }` + +The child node providing partial aggregate rows from partitions. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/MetadataScanNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/MetadataScanNode.md new file mode 100644 index 0000000..3f20016 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/MetadataScanNode.md @@ -0,0 +1,79 @@ + + +# MetadataScanNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Scan node that queries Dataverse metadata API instead of entity data. +Used for metadata.entity, metadata.attribute, etc. virtual tables. +Leaf node in the execution plan tree. + +## Members + +### Constructors + +#### MetadataScanNode(string metadataTable, IMetadataQueryExecutor metadataExecutor, IReadOnlyList requestedColumns, CompiledPredicate filter) + +`MetadataScanNode(string metadataTable, IMetadataQueryExecutor metadataExecutor, IReadOnlyList requestedColumns, CompiledPredicate filter)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.MetadataScanNode` class. + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### Filter + +`CompiledPredicate Filter { get; }` + +Optional compiled client-side filter predicate. + +#### MetadataExecutor + +`IMetadataQueryExecutor MetadataExecutor { get; }` + +The metadata query executor. + +#### MetadataTable + +`string MetadataTable { get; }` + +The metadata virtual table name (e.g., "entity", "attribute"). + +#### RequestedColumns + +`IReadOnlyList RequestedColumns { get; }` + +Columns to return from the metadata table (null = all). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ParallelPartitionNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ParallelPartitionNode.md new file mode 100644 index 0000000..b02058e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ParallelPartitionNode.md @@ -0,0 +1,66 @@ + + +# ParallelPartitionNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Executes child plan nodes in parallel, limited by pool capacity. +Used for parallel aggregate partitioning. + +## Members + +### Constructors + +#### ParallelPartitionNode(IReadOnlyList partitions, int maxParallelism) + +`ParallelPartitionNode(IReadOnlyList partitions, int maxParallelism)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.ParallelPartitionNode` class. + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### MaxParallelism + +`int MaxParallelism { get; }` + +The maximum number of partitions to execute concurrently. + +#### Partitions + +`IReadOnlyList Partitions { get; }` + +The child plan nodes representing each partition. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/PrefetchScanNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/PrefetchScanNode.md new file mode 100644 index 0000000..4639652 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/PrefetchScanNode.md @@ -0,0 +1,71 @@ + + +# PrefetchScanNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Wraps any IQueryPlanNode to speculatively prefetch rows into a bounded buffer. +The background producer fetches from the source node while the consumer reads ahead. +Uses System.Threading.Channels for efficient producer-consumer with backpressure. + +## Members + +### Constructors + +#### PrefetchScanNode(IQueryPlanNode source, int bufferSize) + +`PrefetchScanNode(IQueryPlanNode source, int bufferSize)` + +Creates a prefetch wrapper around a source node. + +- Param `source`: The source node to prefetch from. + +- Param `bufferSize`: Maximum rows to buffer ahead (default: 5000 = ~3 FetchXML pages). + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### BufferSize + +`int BufferSize { get; }` + +Number of rows to buffer ahead (controls memory usage). + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### Source + +`IQueryPlanNode Source { get; }` + +The source node to prefetch from. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ProjectColumn.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ProjectColumn.md new file mode 100644 index 0000000..85cd049 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ProjectColumn.md @@ -0,0 +1,55 @@ + + +# ProjectColumn + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Defines a column in a ProjectNode's output. + +## Members + +### Methods + +#### Computed + +`ProjectColumn Computed(string outputName, CompiledScalarExpression expression)` + +Creates a computed column from a compiled expression. + +#### PassThrough + +`ProjectColumn PassThrough(string name)` + +Creates a pass-through column (same name in and out). + +#### Rename + +`ProjectColumn Rename(string sourceName, string outputName)` + +Creates a renamed column. + + +### Properties + +#### Expression + +`CompiledScalarExpression Expression { get; }` + +Compiled expression to evaluate for computed columns. Null for simple copy/rename. + +#### OutputName + +`string OutputName { get; }` + +Output column name in the result row. + +#### SourceName + +`string SourceName { get; }` + +Source column name to copy from input row. Null if using Expression. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ProjectNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ProjectNode.md new file mode 100644 index 0000000..c5845b3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/ProjectNode.md @@ -0,0 +1,65 @@ + + +# ProjectNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Maps input rows to output rows (column selection, renaming, expression evaluation). + +## Members + +### Constructors + +#### ProjectNode(IQueryPlanNode input, IReadOnlyList outputColumns) + +`ProjectNode(IQueryPlanNode input, IReadOnlyList outputColumns)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.ProjectNode` class. + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### Input + +`IQueryPlanNode Input { get; }` + +The input node providing source rows. + +#### OutputColumns + +`IReadOnlyList OutputColumns { get; }` + +The output column projections. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/RemoteScanNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/RemoteScanNode.md new file mode 100644 index 0000000..993e93f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/RemoteScanNode.md @@ -0,0 +1,77 @@ + + +# RemoteScanNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Executes a FetchXML query against a remote environment's connection pool. +Used for cross-environment queries where bracket syntax ([LABEL].entity) +references a different Dataverse environment. + +## Members + +### Constructors + +#### RemoteScanNode(string fetchXml, string entityLogicalName, string remoteLabel, IQueryExecutor remoteExecutor, int maxPages) + +`RemoteScanNode(string fetchXml, string entityLogicalName, string remoteLabel, IQueryExecutor remoteExecutor, int maxPages)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.RemoteScanNode` class. + +- Param `fetchXml`: The FetchXML query to execute. + +- Param `entityLogicalName`: The entity being queried. + +- Param `remoteLabel`: The label of the remote environment. + +- Param `remoteExecutor`: The query executor for the remote environment. + +- Param `maxPages`: Maximum number of pages to fetch before throwing (default 200). + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EntityLogicalName + +`string EntityLogicalName { get; }` + +The entity being queried on the remote environment. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### RemoteLabel + +`string RemoteLabel { get; }` + +The label of the remote environment (e.g., "UAT", "PROD"). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/TdsScanNode.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/TdsScanNode.md new file mode 100644 index 0000000..f74bd79 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/TdsScanNode.md @@ -0,0 +1,79 @@ + + +# TdsScanNode + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryPlanNode` + +## Summary + +Executes a SQL query directly against the Dataverse TDS Endpoint. +Leaf node in the execution plan tree — bypasses FetchXML transpilation +and sends the original SQL over the TDS wire protocol (port 5558). + +## Members + +### Constructors + +#### TdsScanNode(string sql, string entityLogicalName, ITdsQueryExecutor tdsExecutor, Nullable maxRows) + +`TdsScanNode(string sql, string entityLogicalName, ITdsQueryExecutor tdsExecutor, Nullable maxRows)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.TdsScanNode` class. + + +### Methods + +#### ExecuteAsync + +`IAsyncEnumerable ExecuteAsync(QueryPlanContext context, CancellationToken cancellationToken)` + +Execute this node, producing rows. + + +### Properties + +#### Children + +`IReadOnlyList Children { get; }` + +Child nodes (inputs to this operator). + +#### Description + +`string Description { get; }` + +Human-readable description for EXPLAIN output. + +#### EntityLogicalName + +`string EntityLogicalName { get; }` + +The entity logical name being queried. + +#### EstimatedRows + +`long EstimatedRows { get; }` + +Estimated row count (for cost-based decisions). -1 if unknown. + +#### MaxRows + +`Nullable MaxRows { get; }` + +Maximum rows to return, if any. + +#### Sql + +`string Sql { get; }` + +The original SQL query to execute via TDS. + +#### TdsExecutor + +`ITdsQueryExecutor TdsExecutor { get; }` + +The TDS query executor for SQL execution. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/WindowDefinition.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/WindowDefinition.md new file mode 100644 index 0000000..90ece4c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Nodes/WindowDefinition.md @@ -0,0 +1,62 @@ + + +# WindowDefinition + +- Namespace: `PPDS.Dataverse.Query.Planning.Nodes` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Defines a single window function to compute within a ClientWindowNode. +Uses compiled delegates instead of AST types. + +## Members + +### Constructors + +#### WindowDefinition(string outputColumnName, string functionName, CompiledScalarExpression operand, IReadOnlyList partitionBy, IReadOnlyList orderBy, bool isCountStar) + +`WindowDefinition(string outputColumnName, string functionName, CompiledScalarExpression operand, IReadOnlyList partitionBy, IReadOnlyList orderBy, bool isCountStar)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Nodes.WindowDefinition` class. + + +### Properties + +#### FunctionName + +`string FunctionName { get; }` + +The window function name (ROW_NUMBER, RANK, DENSE_RANK, SUM, COUNT, AVG, MIN, MAX). + +#### IsCountStar + +`bool IsCountStar { get; }` + +True when this is COUNT(*) with star instead of a column expression. + +#### Operand + +`CompiledScalarExpression Operand { get; }` + +Optional compiled operand for aggregate window functions (e.g., SUM(revenue)). Null for ranking functions. + +#### OrderBy + +`IReadOnlyList OrderBy { get; }` + +Compiled ORDER BY items within the window. Null or empty if not specified. + +#### OutputColumnName + +`string OutputColumnName { get; }` + +The output column name for this window function's result. + +#### PartitionBy + +`IReadOnlyList PartitionBy { get; }` + +Compiled PARTITION BY expressions (groups rows into partitions). Null or empty if not specified. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Partitioning/DateRangePartition.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Partitioning/DateRangePartition.md new file mode 100644 index 0000000..10ba682 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Partitioning/DateRangePartition.md @@ -0,0 +1,44 @@ + + +# DateRangePartition + +- Namespace: `PPDS.Dataverse.Query.Planning.Partitioning` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +A single date range partition with non-overlapping boundaries. +Start is inclusive, End is exclusive: [Start, End). + +## Members + +### Constructors + +#### DateRangePartition(DateTime start, DateTime end, int index) + +`DateRangePartition(DateTime start, DateTime end, int index)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.Partitioning.DateRangePartition` class. + + +### Properties + +#### End + +`DateTime End { get; }` + +Exclusive end of the date range. + +#### Index + +`int Index { get; }` + +Zero-based index of this partition. + +#### Start + +`DateTime Start { get; }` + +Inclusive start of the date range. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Partitioning/DateRangePartitioner.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Partitioning/DateRangePartitioner.md new file mode 100644 index 0000000..39b34b6 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/Partitioning/DateRangePartitioner.md @@ -0,0 +1,33 @@ + + +# DateRangePartitioner + +- Namespace: `PPDS.Dataverse.Query.Planning.Partitioning` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Generates non-overlapping date range partitions for splitting aggregate queries +that exceed the Dataverse AggregateQueryRecordLimit (50K records). + +## Members + +### Methods + +#### CalculatePartitions + +`IReadOnlyList CalculatePartitions(long estimatedRecordCount, DateTime minDate, DateTime maxDate, int maxRecordsPerPartition)` + +Calculates partition boundaries for a given record count and date range. + +- Param `estimatedRecordCount`: Estimated total records. + +- Param `minDate`: Earliest record date. + +- Param `maxDate`: Latest record date. + +- Param `maxRecordsPerPartition`: Maximum records per partition (default: 40000 to stay below 50K limit). + +- Returns: List of date range partitions. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/PlanFormatter.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/PlanFormatter.md new file mode 100644 index 0000000..ac72aa6 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/PlanFormatter.md @@ -0,0 +1,28 @@ + + +# PlanFormatter + +- Namespace: `PPDS.Dataverse.Query.Planning` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Formats an execution plan tree as indented text for EXPLAIN output. + +## Members + +### Methods + +#### Format + +`string Format(IQueryPlanNode rootNode)` + +Renders a plan node tree (from `PPDS.Dataverse.Query.Planning.IQueryPlanNode`) as a formatted string. + +#### Format + +`string Format(QueryPlanDescription plan)` + +Renders a plan description tree as a formatted string. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanContext.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanContext.md new file mode 100644 index 0000000..a989e51 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanContext.md @@ -0,0 +1,97 @@ + + +# QueryPlanContext + +- Namespace: `PPDS.Dataverse.Query.Planning` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Shared context for plan execution: pool, cancellation, statistics. + +## Members + +### Constructors + +#### QueryPlanContext(IQueryExecutor queryExecutor, CancellationToken cancellationToken, QueryPlanStatistics statistics, IQueryProgressReporter progressReporter, ITdsQueryExecutor tdsQueryExecutor, IMetadataQueryExecutor metadataQueryExecutor, IBulkOperationExecutor bulkOperationExecutor, VariableScope variableScope, int maxMaterializationRows, QueryExecutionOptions executionOptions, ICachedMetadataProvider metadataProvider) + +`QueryPlanContext(IQueryExecutor queryExecutor, CancellationToken cancellationToken, QueryPlanStatistics statistics, IQueryProgressReporter progressReporter, ITdsQueryExecutor tdsQueryExecutor, IMetadataQueryExecutor metadataQueryExecutor, IBulkOperationExecutor bulkOperationExecutor, VariableScope variableScope, int maxMaterializationRows, QueryExecutionOptions executionOptions, ICachedMetadataProvider metadataProvider)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.QueryPlanContext` class. + + +### Properties + +#### BulkOperationExecutor + +`IBulkOperationExecutor BulkOperationExecutor { get; }` + +Optional bulk operation executor for DML operations (INSERT, UPDATE, DELETE). + +#### CancellationToken + +`CancellationToken CancellationToken { get; }` + +Cancellation token for the entire plan execution. + +#### ExecutionOptions + +`QueryExecutionOptions ExecutionOptions { get; }` + +Per-query execution options (bypass plugins/flows). Null means no overrides. +Consumed by `PPDS.Dataverse.Query.Planning.Nodes.FetchXmlScanNode` +when calling `PPDS.Dataverse.Query.IQueryExecutor.ExecuteFetchXmlAsync(System.String,System.Nullable,System.String,System.Boolean,PPDS.Dataverse.Query.QueryExecutionOptions,System.Threading.CancellationToken)`. + +#### MaxMaterializationRows + +`int MaxMaterializationRows { get; }` + +Maximum rows a node may materialize in memory (e.g., for sorting or aggregation). +Default is 500,000. Set to 0 for unlimited. + +#### MetadataProvider + +`ICachedMetadataProvider MetadataProvider { get; }` + +Optional cached metadata provider. When supplied, DML nodes use this to coerce +SQL literals into Dataverse SDK types (`EntityReference`, `OptionSetValue`, etc.) +for lookup, choice, and money attributes. Null disables coercion (raw CLR values are +passed through to `Entity[attr]`). + +#### MetadataQueryExecutor + +`IMetadataQueryExecutor MetadataQueryExecutor { get; }` + +Optional metadata query executor for metadata virtual tables (Phase 6). + +#### ProgressReporter + +`IQueryProgressReporter ProgressReporter { get; }` + +Optional progress reporter for long-running operations. + +#### QueryExecutor + +`IQueryExecutor QueryExecutor { get; }` + +Connection pool for executing FetchXML queries. + +#### Statistics + +`QueryPlanStatistics Statistics { get; }` + +Mutable statistics: nodes report actual row counts and timing. + +#### TdsQueryExecutor + +`ITdsQueryExecutor TdsQueryExecutor { get; }` + +Optional TDS Endpoint executor for direct SQL execution (Phase 3.5). + +#### VariableScope + +`VariableScope VariableScope { get; }` + +Optional variable scope for resolving @variable references in expressions. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanDescription.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanDescription.md new file mode 100644 index 0000000..0f5db5a --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanDescription.md @@ -0,0 +1,61 @@ + + +# QueryPlanDescription + +- Namespace: `PPDS.Dataverse.Query.Planning` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Describes an execution plan for display (EXPLAIN output). + +## Members + +### Methods + +#### FromNode + +`QueryPlanDescription FromNode(IQueryPlanNode node)` + +Creates a description tree from a plan node. + + +### Properties + +#### Children + +`IReadOnlyList Children { get; set; }` + +Child node descriptions. + +#### Description + +`string Description { get; set; }` + +Human-readable description. + +#### EffectiveParallelism + +`Nullable EffectiveParallelism { get; set; }` + +Effective parallelism (number of partitions), if applicable. + +#### EstimatedRows + +`long EstimatedRows { get; set; }` + +Estimated row count (-1 if unknown). + +#### NodeType + +`string NodeType { get; set; }` + +The root node description. + +#### PoolCapacity + +`Nullable PoolCapacity { get; set; }` + +Connection pool capacity, if known. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanOptions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanOptions.md new file mode 100644 index 0000000..c34ec3c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanOptions.md @@ -0,0 +1,165 @@ + + +# QueryPlanOptions + +- Namespace: `PPDS.Dataverse.Query.Planning` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Options for query plan construction. + +## Members + +### Properties + +#### AggregateRecordLimit + +`int AggregateRecordLimit { get; set; }` + +Maximum records per partition for aggregate partitioning. Default is 40,000 +to stay safely below the Dataverse 50K AggregateQueryRecordLimit. + +#### CteBindings + +`Dictionary CteBindings { get; set; }` + +CTE name-to-node bindings for recursive CTE planning. When the planner +encounters a table matching a CTE name in this dictionary, it returns +the bound node instead of generating FetchXML. + +#### DmlRowCap + +`Nullable DmlRowCap { get; set; }` + +Row cap for DML operations. null = unlimited, default comes from DmlSafetyGuard (10,000). + +#### EnablePrefetch + +`bool EnablePrefetch { get; set; }` + +Whether to wrap scan nodes with PrefetchScanNode for page-ahead buffering. Default false (opt-in). + +#### EstimatedRecordCount + +`Nullable EstimatedRecordCount { get; set; }` + +Estimated total record count for the query's entity. When set for aggregate queries +and the count exceeds `PPDS.Dataverse.Query.Planning.QueryPlanOptions.AggregateRecordLimit`, the planner partitions the +query by date range and executes partitions in parallel across the connection pool. +Obtained from `PPDS.Dataverse.Query.IQueryExecutor.GetTotalRecordCountAsync(System.String,System.Threading.CancellationToken)` by the caller. + +#### ExplainOnly + +`bool ExplainOnly { get; set; }` + +If true, build plan for explanation only — don't execute. + +#### ForceClientAggregation + +`bool ForceClientAggregation { get; set; }` + +When true, forces client-side hash grouping instead of Dataverse-side aggregation. +Set by the `-- ppds:HASH_GROUP` query hint. + +#### IncludeCount + +`bool IncludeCount { get; set; }` + +Whether to include total record count in the result. + +#### MaxDate + +`Nullable MaxDate { get; set; }` + +Latest createdon date in the target entity. Required for aggregate partitioning. + +#### MaxRecordsPerPartition + +`int MaxRecordsPerPartition { get; set; }` + +Maximum records per partition. Default is 40,000 to provide headroom below the 50K limit. + +#### MaxRows + +`Nullable MaxRows { get; set; }` + +Global row limit, if any. + +#### MinDate + +`Nullable MinDate { get; set; }` + +Earliest createdon date in the target entity. Required for aggregate partitioning. + +#### NoLock + +`bool NoLock { get; set; }` + +When true, signals FetchXmlScanNode to inject `no-lock="true"` into FetchXML. +Set by the `-- ppds:NOLOCK` query hint. + +#### OriginalSql + +`string OriginalSql { get; set; }` + +The original SQL text, needed for TDS Endpoint routing. +When `PPDS.Dataverse.Query.Planning.QueryPlanOptions.UseTdsEndpoint` is true, this SQL is passed directly +to the TDS Endpoint instead of being transpiled to FetchXML. + +#### PageNumber + +`Nullable PageNumber { get; set; }` + +Page number for caller-controlled paging (1-based). +When set, the plan fetches only this single page instead of auto-paging. + +#### PagingCookie + +`string PagingCookie { get; set; }` + +Paging cookie from a previous result for continuation. +Used with `PPDS.Dataverse.Query.Planning.QueryPlanOptions.PageNumber` for caller-controlled paging. + +#### PoolCapacity + +`int PoolCapacity { get; set; }` + +Pool capacity from pool.GetTotalRecommendedParallelism(). + +#### PrefetchBufferSize + +`int PrefetchBufferSize { get; set; }` + +Number of rows to buffer ahead for prefetch. Default 5000 (~3 FetchXML pages). + +#### RemoteExecutorFactory + +`Func RemoteExecutorFactory { get; set; }` + +Factory for creating IQueryExecutor instances for remote environments. +Takes a profile label (e.g., "UAT"), returns an IQueryExecutor for that environment, +or null if the label is not found. +Combines profile resolution and executor creation. Set by the caller. + +#### TdsQueryExecutor + +`ITdsQueryExecutor TdsQueryExecutor { get; set; }` + +The TDS query executor for direct SQL execution (Phase 3.5). +Required when `PPDS.Dataverse.Query.Planning.QueryPlanOptions.UseTdsEndpoint` is true. + +#### UseTdsEndpoint + +`bool UseTdsEndpoint { get; set; }` + +Whether to use the TDS Endpoint (Phase 3.5). + +#### VariableScope + +`VariableScope VariableScope { get; set; }` + +Optional variable scope for substituting @variable references in WHERE conditions +with literal values before FetchXML transpilation. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanResult.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanResult.md new file mode 100644 index 0000000..de34c5c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanResult.md @@ -0,0 +1,41 @@ + + +# QueryPlanResult + +- Namespace: `PPDS.Dataverse.Query.Planning` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +The result of building an execution plan: the root plan node plus metadata +needed for execution and backward compatibility. + +## Members + +### Properties + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +The primary entity logical name. + +#### FetchXml + +`string FetchXml { get; set; }` + +The generated FetchXML (for backward compatibility with SqlQueryResult). + +#### RootNode + +`IQueryPlanNode RootNode { get; set; }` + +The root node of the execution plan. + +#### VirtualColumns + +`IReadOnlyDictionary VirtualColumns { get; set; }` + +Virtual columns detected during transpilation. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanStatistics.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanStatistics.md new file mode 100644 index 0000000..665fdba --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryPlanStatistics.md @@ -0,0 +1,116 @@ + + +# QueryPlanStatistics + +- Namespace: `PPDS.Dataverse.Query.Planning` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Mutable statistics collected during plan execution. +Thread-safe for parallel node execution via Interlocked operations. + +## Members + +### Methods + +#### AddExecutionTimeMs + +`void AddExecutionTimeMs(long ms)` + +Adds `ms` to `PPDS.Dataverse.Query.Planning.QueryPlanStatistics.ExecutionTimeMs`. + +#### AddRowsOutput + +`void AddRowsOutput(long count)` + +Adds `count` to `PPDS.Dataverse.Query.Planning.QueryPlanStatistics.RowsOutput`. + +#### AddRowsRead + +`void AddRowsRead(long count)` + +Adds `count` to `PPDS.Dataverse.Query.Planning.QueryPlanStatistics.RowsRead`. + +#### IncrementPagesFetched + +`void IncrementPagesFetched()` + +Increments `PPDS.Dataverse.Query.Planning.QueryPlanStatistics.PagesFetched` by one. + +#### IncrementRowsOutput + +`void IncrementRowsOutput()` + +Increments `PPDS.Dataverse.Query.Planning.QueryPlanStatistics.RowsOutput` by one. + +#### IncrementRowsRead + +`void IncrementRowsRead()` + +Increments `PPDS.Dataverse.Query.Planning.QueryPlanStatistics.RowsRead` by one. + + +### Properties + +#### ExecutionTimeMs + +`long ExecutionTimeMs { get; }` + +Total execution time in milliseconds. + +#### LastMoreRecords + +`bool LastMoreRecords { get; set; }` + +Whether more records are available after the last fetched page. + +#### LastPageNumber + +`int LastPageNumber { get; set; }` + +Page number of the last fetched page. + +#### LastPagingCookie + +`string LastPagingCookie { get; set; }` + +Paging cookie from the last fetched page (for caller-controlled paging). + +#### LastTotalCount + +`Nullable LastTotalCount { get; set; }` + +Total record count from the last fetched page, if requested. + +#### NodeStats + +`ConcurrentDictionary NodeStats { get; }` + +Per-node statistics keyed by node description. + +#### PagesFetched + +`long PagesFetched { get; }` + +Total FetchXML pages fetched. + +#### RowsOutput + +`long RowsOutput { get; }` + +Total rows output by the plan root. + +#### RowsRead + +`long RowsRead { get; }` + +Total rows read from data sources. + +#### SuppressPagingMetadata + +`bool SuppressPagingMetadata { get; set; }` + +When true, paging metadata writes are suppressed (parallel execution). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryRow.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryRow.md new file mode 100644 index 0000000..d81bff1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/Planning/QueryRow.md @@ -0,0 +1,46 @@ + + +# QueryRow + +- Namespace: `PPDS.Dataverse.Query.Planning` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +A single row flowing through the plan. Lightweight wrapper around column values. + +## Members + +### Constructors + +#### QueryRow(IReadOnlyDictionary values, string entityLogicalName) + +`QueryRow(IReadOnlyDictionary values, string entityLogicalName)` + +Initializes a new instance of the `PPDS.Dataverse.Query.Planning.QueryRow` class. + + +### Methods + +#### FromRecord + +`QueryRow FromRecord(IReadOnlyDictionary record, string entityLogicalName)` + +Creates a QueryRow from a QueryResult record. + + +### Properties + +#### EntityLogicalName + +`string EntityLogicalName { get; }` + +The entity logical name this row originated from. + +#### Values + +`IReadOnlyDictionary Values { get; }` + +Column name → value. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryColumn.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryColumn.md new file mode 100644 index 0000000..4fc04d1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryColumn.md @@ -0,0 +1,78 @@ + + +# QueryColumn + +- Namespace: `PPDS.Dataverse.Query` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Represents a column in a query result with its metadata. + +## Members + +### Properties + +#### AggregateFunction + +`string AggregateFunction { get; set; }` + +The aggregate function used, if this is an aggregate column. + +#### Alias + +`string Alias { get; set; }` + +The alias assigned to this column in the query, if any. +Used for aggregate functions and renamed columns. + +#### DataType + +`QueryColumnType DataType { get; set; }` + +The data type of this column's values. + +#### DisplayName + +`string DisplayName { get; set; }` + +The display name of the attribute from metadata, if available. + +#### EffectiveName + +`string EffectiveName { get; }` + +Gets the effective name to use for this column in results. +Returns the alias if set, otherwise the logical name. + +#### IsAggregate + +`bool IsAggregate { get; set; }` + +Whether this column is from an aggregate function. + +#### LinkedEntityAlias + +`string LinkedEntityAlias { get; set; }` + +For link-entity columns, the alias of the linked entity. + +#### LinkedEntityName + +`string LinkedEntityName { get; set; }` + +For link-entity columns, the logical name of the linked entity. + +#### LogicalName + +`string LogicalName { get; set; }` + +The logical name of the attribute. + +#### QualifiedName + +`string QualifiedName { get; }` + +Gets the fully qualified name including linked entity alias if present. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryColumnType.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryColumnType.md new file mode 100644 index 0000000..c408452 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryColumnType.md @@ -0,0 +1,113 @@ + + +# QueryColumnType + +- Namespace: `PPDS.Dataverse.Query` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Represents the data type of a column in a query result. + +## Members + +### Fields + +#### AliasedValue + +`QueryColumnType AliasedValue` + +Aliased aggregate value (from COUNT, SUM, etc.). + +#### BigInt + +`QueryColumnType BigInt` + +Whole number (64-bit integer). + +#### Boolean + +`QueryColumnType Boolean` + +Boolean true/false value. + +#### DateTime + +`QueryColumnType DateTime` + +Date and time value. + +#### Decimal + +`QueryColumnType Decimal` + +Decimal number. + +#### Double + +`QueryColumnType Double` + +Floating-point number. + +#### Guid + +`QueryColumnType Guid` + +Globally unique identifier. + +#### Image + +`QueryColumnType Image` + +Entity image/file data. + +#### Integer + +`QueryColumnType Integer` + +Whole number (32-bit integer). + +#### Lookup + +`QueryColumnType Lookup` + +Reference to another entity record (lookup). + +#### Memo + +`QueryColumnType Memo` + +Memo/multi-line text. + +#### Money + +`QueryColumnType Money` + +Currency value with formatting. + +#### MultiSelectOptionSet + +`QueryColumnType MultiSelectOptionSet` + +Multi-select option set value. + +#### OptionSet + +`QueryColumnType OptionSet` + +Option set (picklist) value. + +#### String + +`QueryColumnType String` + +Text string value. + +#### Unknown + +`QueryColumnType Unknown` + +Unknown or undetected type. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryExecutionOptions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryExecutionOptions.md new file mode 100644 index 0000000..87a1abb --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryExecutionOptions.md @@ -0,0 +1,35 @@ + + +# QueryExecutionOptions + +- Namespace: `PPDS.Dataverse.Query` +- Assembly: `PPDS.Dataverse` +- Kind: Record +- Implements: `IEquatable` + +## Summary + +Per-query execution options that affect how the query is sent to Dataverse. +These options map to `OrganizationRequest.Parameters` keys that modify +server-side behavior (e.g., bypassing plugins or flows). + +## Members + +### Properties + +#### BypassFlows + +`bool BypassFlows { get; set; }` + +When true, adds `SuppressCallbackRegistrationExpanderJob = true` to the request, +preventing Power Automate flows from triggering for the query. +Set by the `-- ppds:BYPASS_FLOWS` query hint. + +#### BypassPlugins + +`bool BypassPlugins { get; set; }` + +When true, adds `BypassCustomPluginExecution = true` to the request, +skipping synchronous plugin execution for the query. +Set by the `-- ppds:BYPASS_PLUGINS` query hint. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryExecutor.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryExecutor.md new file mode 100644 index 0000000..55c97bb --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryExecutor.md @@ -0,0 +1,96 @@ + + +# QueryExecutor + +- Namespace: `PPDS.Dataverse.Query` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IQueryExecutor` + +## Summary + +Executes FetchXML queries against Dataverse using the connection pool. + +## Members + +### Constructors + +#### QueryExecutor(IDataverseConnectionPool connectionPool, ILogger logger) + +`QueryExecutor(IDataverseConnectionPool connectionPool, ILogger logger)` + +Initializes a new instance of the `PPDS.Dataverse.Query.QueryExecutor` class. + +- Param `connectionPool`: The connection pool. + +- Param `logger`: Optional logger. + + +### Methods + +#### ExecuteFetchXmlAllPagesAsync + +`Task ExecuteFetchXmlAllPagesAsync(string fetchXml, int maxRecords, CancellationToken cancellationToken)` + +Executes a FetchXML query with automatic paging, returning all results. +Use with caution for large result sets. + +- Param `fetchXml`: The FetchXML query to execute. + +- Param `maxRecords`: Maximum total records to retrieve. Default is 5000. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The query result containing all records up to maxRecords. + +#### ExecuteFetchXmlAsync + +`Task ExecuteFetchXmlAsync(string fetchXml, Nullable pageNumber, string pagingCookie, bool includeCount, CancellationToken cancellationToken)` + +Executes a FetchXML query and returns the results. + +- Param `fetchXml`: The FetchXML query to execute. + +- Param `pageNumber`: Optional page number for paging (1-based). If null, uses page 1. + +- Param `pagingCookie`: Optional paging cookie from a previous query result for continuation. + +- Param `includeCount`: Whether to include the total record count in the result. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The query result containing records, columns, and paging information. + +#### ExecuteFetchXmlAsync + +`Task ExecuteFetchXmlAsync(string fetchXml, Nullable pageNumber, string pagingCookie, bool includeCount, QueryExecutionOptions executionOptions, CancellationToken cancellationToken)` + +Executes a FetchXML query with optional execution options (bypass plugins/flows). +Default implementation ignores execution options and delegates to the base overload. +Override in concrete classes to apply `PPDS.Dataverse.Query.QueryExecutionOptions`. + +#### GetMinMaxCreatedOnAsync + +`Task, Nullable>> GetMinMaxCreatedOnAsync(string entityLogicalName, CancellationToken cancellationToken)` + +Gets the min and max createdon dates for an entity, used for aggregate partitioning. + +- Param `entityLogicalName`: The logical name of the entity. + +- Param `cancellationToken`: Cancellation token. + +- Returns: A tuple of (Min, Max) DateTime values, or (null, null) if not available. + +#### GetTotalRecordCountAsync + +`Task> GetTotalRecordCountAsync(string entityLogicalName, CancellationToken cancellationToken)` + +Gets the total record count for an entity using RetrieveTotalRecordCountRequest. +This is a near-instant metadata read, not a full table scan. + +- Param `entityLogicalName`: The logical name of the entity to count. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The total count, or null if not supported for this entity. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryResult.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryResult.md new file mode 100644 index 0000000..d92e517 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryResult.md @@ -0,0 +1,96 @@ + + +# QueryResult + +- Namespace: `PPDS.Dataverse.Query` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Represents the result of a query execution against Dataverse. +Contains the records, column metadata, and paging information. + +## Members + +### Methods + +#### Empty + +`QueryResult Empty(string entityLogicalName)` + +Creates an empty result with no records. + + +### Properties + +#### Columns + +`IReadOnlyList Columns { get; set; }` + +Metadata about the columns in the result set. + +#### Count + +`int Count { get; set; }` + +The number of records in this result page. + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +The logical name of the primary entity being queried. + +#### ExecutedFetchXml + +`string ExecutedFetchXml { get; set; }` + +The FetchXML that was actually executed. +For SQL queries, this is the transpiled FetchXML. + +#### ExecutionTimeMs + +`long ExecutionTimeMs { get; set; }` + +The time taken to execute the query. + +#### IsAggregate + +`bool IsAggregate { get; set; }` + +Whether the query was an aggregate query. + +#### MoreRecords + +`bool MoreRecords { get; set; }` + +Whether there are more records available beyond this page. + +#### PageNumber + +`int PageNumber { get; set; }` + +The current page number (1-based). + +#### PagingCookie + +`string PagingCookie { get; set; }` + +The paging cookie for fetching the next page of results. +Pass this to the next query execution to continue. + +#### Records + +`IReadOnlyList> Records { get; set; }` + +The records returned by the query. +Each record is a dictionary mapping column names to their values. + +#### TotalCount + +`Nullable TotalCount { get; set; }` + +The total number of records matching the query, if count was requested. +Only populated when the query includes returntotalrecordcount. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryValue.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryValue.md new file mode 100644 index 0000000..6767882 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/QueryValue.md @@ -0,0 +1,97 @@ + + +# QueryValue + +- Namespace: `PPDS.Dataverse.Query` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Represents a value in a query result, including both the raw value +and its formatted display representation. + +## Members + +### Methods + +#### Lookup + +`QueryValue Lookup(Guid id, string entityType, string displayName)` + +Creates a lookup value with entity reference details. + +#### Simple + +`QueryValue Simple(object value)` + +Creates a simple value with no formatting. + +#### WithFormatting + +`QueryValue WithFormatting(object value, string formatted)` + +Creates a value with formatted display text. + + +### Properties + +#### FormattedValue + +`string FormattedValue { get; set; }` + +The formatted display value as a string. +For lookups, this is the display name. +For option sets, this is the label. +For money, this includes currency formatting. + +#### HasFormattedValue + +`bool HasFormattedValue { get; }` + +Returns true if this value has a formatted representation that differs from the raw value. +Used to determine if a *name column should be expanded. + +#### IsBoolean + +`bool IsBoolean { get; }` + +Returns true if this value represents a boolean with formatted value. + +#### IsLookup + +`bool IsLookup { get; }` + +Returns true if this value represents a lookup (EntityReference). + +#### IsOptionSet + +`bool IsOptionSet { get; }` + +Returns true if this value represents an optionset (integer with formatted label). + +#### LookupEntityId + +`Nullable LookupEntityId { get; set; }` + +For lookup values, the target record ID. + +#### LookupEntityType + +`string LookupEntityType { get; set; }` + +For lookup values, the target entity logical name. + +#### Null + +`QueryValue Null { get; }` + +Creates a null value. + +#### Value + +`object Value { get; set; }` + +The raw value. Can be null, a primitive (string, int, bool, etc.), +a Guid, a DateTime, or for lookups an EntityReference. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/TdsCompatibility.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/TdsCompatibility.md new file mode 100644 index 0000000..821687e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/TdsCompatibility.md @@ -0,0 +1,41 @@ + + +# TdsCompatibility + +- Namespace: `PPDS.Dataverse.Query` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Result of a TDS Endpoint compatibility check. + +## Members + +### Fields + +#### Compatible + +`TdsCompatibility Compatible` + +The query can be executed via the TDS Endpoint. + +#### IncompatibleDml + +`TdsCompatibility IncompatibleDml` + +The query is a DML statement (INSERT, UPDATE, DELETE) which TDS does not support. + +#### IncompatibleEntity + +`TdsCompatibility IncompatibleEntity` + +The target entity is not available via the TDS Endpoint (e.g., elastic/virtual table). + +#### IncompatibleFeature + +`TdsCompatibility IncompatibleFeature` + +The query uses a feature not supported by the TDS Endpoint (e.g., virtual *name columns). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/TdsCompatibilityChecker.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/TdsCompatibilityChecker.md new file mode 100644 index 0000000..20eebdc --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/TdsCompatibilityChecker.md @@ -0,0 +1,49 @@ + + +# TdsCompatibilityChecker + +- Namespace: `PPDS.Dataverse.Query` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Determines whether a SQL query can be executed via the Dataverse TDS Endpoint. +The TDS Endpoint is read-only and does not support all entity types or SQL features. + +## Members + +### Methods + +#### CheckCompatibility + +`TdsCompatibility CheckCompatibility(string sql, string entityLogicalName)` + +Checks whether a SQL query is compatible with the TDS Endpoint. + +- Param `sql`: The SQL query to check. + +- Param `entityLogicalName`: The primary entity logical name, if known. + +- Returns: The compatibility result. + +#### IsDmlStatement + +`bool IsDmlStatement(string sql)` + +Checks whether the SQL statement is a DML statement (non-SELECT). + +- Param `sql`: The SQL statement to check. + +- Returns: True if the statement is DML and cannot be executed via TDS. + +#### IsIncompatibleEntity + +`bool IsIncompatibleEntity(string entityLogicalName)` + +Checks whether an entity is incompatible with the TDS Endpoint. + +- Param `entityLogicalName`: The logical name of the entity. + +- Returns: True if the entity cannot be queried via TDS. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/TdsQueryExecutor.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/TdsQueryExecutor.md new file mode 100644 index 0000000..2cdbada --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Query/TdsQueryExecutor.md @@ -0,0 +1,99 @@ + + +# TdsQueryExecutor + +- Namespace: `PPDS.Dataverse.Query` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `ITdsQueryExecutor` + +## Summary + +Executes SQL queries against Dataverse's TDS Endpoint using the SQL Server wire protocol. +The TDS Endpoint provides read-only access to Dataverse data on port 5558. + +## Members + +### Constructors + +#### TdsQueryExecutor(string orgUrl, Func> tokenProvider, ILogger logger) + +`TdsQueryExecutor(string orgUrl, Func> tokenProvider, ILogger logger)` + +Initializes a new instance of the `PPDS.Dataverse.Query.TdsQueryExecutor` class. + +- Param `orgUrl`: The Dataverse organization URL (e.g., "https://org.crm.dynamics.com"). + +- Param `tokenProvider`: A function that provides a valid MSAL access token for the Dataverse environment. +Called for each query execution to ensure fresh tokens. + +- Param `logger`: Optional logger. + + +### Methods + +#### BuildConnectionString + +`string BuildConnectionString(string orgHost)` + +Builds the SQL Server connection string for the TDS Endpoint. + +- Param `orgHost`: The normalized org hostname. + +- Returns: The connection string. + +#### ExecuteSqlAsync + +`Task ExecuteSqlAsync(string sql, Nullable maxRows, CancellationToken cancellationToken)` + +Executes a SQL query against the Dataverse TDS Endpoint and returns structured results. + +- Param `sql`: The SQL SELECT query to execute. + +- Param `maxRows`: Optional maximum number of rows to return. If null, returns all rows. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The query result containing records, columns, and execution metadata. + +#### ExtractColumnsFromReader + +`List ExtractColumnsFromReader(SqlDataReader reader)` + +Extracts column metadata from the SqlDataReader schema. + +#### InferEntityName + +`string InferEntityName(string sql)` + +Attempts to infer the entity logical name from a SQL statement. +Looks for the FROM clause and extracts the table name. + +#### MapClrTypeToColumnType + +`QueryColumnType MapClrTypeToColumnType(Type clrType)` + +Maps a CLR type from SqlDataReader to a `PPDS.Dataverse.Query.QueryColumnType`. + +#### MapReaderRow + +`Dictionary MapReaderRow(SqlDataReader reader, List columns)` + +Maps a single row from the SqlDataReader to a record dictionary. + +#### MapSqlValue + +`QueryValue MapSqlValue(object value)` + +Maps a raw SQL value to a `PPDS.Dataverse.Query.QueryValue`. +Handles DBNull, common .NET types, and falls back to string representation. + + +### Fields + +#### TdsPort + +`int TdsPort` + +The port used by the Dataverse TDS Endpoint. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/AuthenticationErrorDetector.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/AuthenticationErrorDetector.md new file mode 100644 index 0000000..8ca58fd --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/AuthenticationErrorDetector.md @@ -0,0 +1,46 @@ + + +# AuthenticationErrorDetector + +- Namespace: `PPDS.Dataverse.Resilience` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Detects authentication and authorization failures from Dataverse operations. + +## Members + +### Methods + +#### GetUserMessage + +`string GetUserMessage(Exception exception)` + +Gets a user-friendly message for an authentication failure. + +- Param `exception`: The exception to describe. + +- Returns: A user-friendly error message. + +#### IsAuthenticationFailure + +`bool IsAuthenticationFailure(Exception exception)` + +Checks if an exception indicates an authentication or authorization failure. + +- Param `exception`: The exception to check. + +- Returns: True if this is an authentication or authorization failure. + +#### RequiresReauthentication + +`bool RequiresReauthentication(Exception exception)` + +Checks if an exception indicates a token/credential failure that requires re-authentication. + +- Param `exception`: The exception to check. + +- Returns: True if this is a token failure requiring re-authentication. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/DataverseAuthenticationException.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/DataverseAuthenticationException.md new file mode 100644 index 0000000..f6308d1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/DataverseAuthenticationException.md @@ -0,0 +1,90 @@ + + +# DataverseAuthenticationException + +- Namespace: `PPDS.Dataverse.Resilience` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Exception` +- Implements: `ISerializable` + +## Summary + +Exception thrown when a Dataverse operation fails due to authentication or authorization issues. + +## Members + +### Constructors + +#### DataverseAuthenticationException(string userMessage, bool requiresReauthentication, Exception innerException) + +`DataverseAuthenticationException(string userMessage, bool requiresReauthentication, Exception innerException)` + +Creates a new authentication exception. + +- Param `userMessage`: A user-friendly error message. + +- Param `requiresReauthentication`: Whether re-authentication is required. + +- Param `innerException`: The original exception. + +#### DataverseAuthenticationException(string userMessage, bool requiresReauthentication, string connectionName, string failedOperation, Exception innerException) + +`DataverseAuthenticationException(string userMessage, bool requiresReauthentication, string connectionName, string failedOperation, Exception innerException)` + +Creates a new authentication exception with context. + +- Param `userMessage`: A user-friendly error message. + +- Param `requiresReauthentication`: Whether re-authentication is required. + +- Param `connectionName`: The connection that failed. + +- Param `failedOperation`: The operation that was being performed. + +- Param `innerException`: The original exception. + + +### Methods + +#### FromException + +`DataverseAuthenticationException FromException(Exception exception, string connectionName, string failedOperation)` + +Creates an authentication exception from an existing exception. + +- Param `exception`: The original exception. + +- Param `connectionName`: The connection that failed. + +- Param `failedOperation`: The operation that was being performed. + +- Returns: A new DataverseAuthenticationException. + + +### Properties + +#### ConnectionName + +`string ConnectionName { get; }` + +Gets the name of the connection that experienced the auth failure. + +#### FailedOperation + +`string FailedOperation { get; }` + +Gets the operation that was being performed when auth failed. + +#### RequiresReauthentication + +`bool RequiresReauthentication { get; }` + +Gets whether the user needs to re-authenticate to continue. + +#### UserMessage + +`string UserMessage { get; }` + +Gets a message safe to display to end users. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/IThrottleTracker.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/IThrottleTracker.md new file mode 100644 index 0000000..85564f6 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/IThrottleTracker.md @@ -0,0 +1,92 @@ + + +# IThrottleTracker + +- Namespace: `PPDS.Dataverse.Resilience` +- Assembly: `PPDS.Dataverse` +- Kind: Interface + +## Summary + +Tracks throttle state across connections. +Used by the connection pool to route requests away from throttled connections. + +## Members + +### Methods + +#### ClearThrottle + +`void ClearThrottle(string connectionName)` + +Clears throttle state for a connection. + +- Param `connectionName`: The connection to clear. + +#### GetShortestExpiry + +`TimeSpan GetShortestExpiry()` + +Gets the shortest time until any throttled connection expires. +Returns `System.TimeSpan.Zero` if no connections are throttled. + +- Returns: The shortest time until a throttle expires, or `System.TimeSpan.Zero` if none are throttled. + +#### GetThrottleExpiry + +`Nullable GetThrottleExpiry(string connectionName)` + +Gets when a connection's throttle expires. + +- Param `connectionName`: The connection to check. + +- Returns: The expiry time, or null if not throttled. + +#### IsThrottled + +`bool IsThrottled(string connectionName)` + +Checks if a connection is currently throttled. + +- Param `connectionName`: The connection to check. + +- Returns: True if the connection is throttled. + +#### RecordThrottle + +`void RecordThrottle(string connectionName, TimeSpan retryAfter)` + +Records a throttle event for a connection. + +- Param `connectionName`: The connection that was throttled. + +- Param `retryAfter`: How long to wait before retrying. + + +### Properties + +#### ThrottledConnectionCount + +`int ThrottledConnectionCount { get; }` + +Gets the number of currently throttled connections. + +#### ThrottledConnections + +`IReadOnlyCollection ThrottledConnections { get; }` + +Gets the names of all currently throttled connections. + +#### TotalBackoffTime + +`TimeSpan TotalBackoffTime { get; }` + +Gets the total backoff time accumulated from all throttle events. +This represents the sum of all RetryAfter durations, not actual time spent waiting. + +#### TotalThrottleEvents + +`long TotalThrottleEvents { get; }` + +Gets the total number of throttle events recorded. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/ResilienceOptions.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/ResilienceOptions.md new file mode 100644 index 0000000..250f882 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/ResilienceOptions.md @@ -0,0 +1,58 @@ + + +# ResilienceOptions + +- Namespace: `PPDS.Dataverse.Resilience` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Configuration options for resilience and retry behavior. + +## Members + +### Properties + +#### DefaultThrottleCooldown + +`TimeSpan DefaultThrottleCooldown { get; set; }` + +Gets or sets the default cooldown period when throttled (if not specified by server). +Default: 5 minutes + +#### EnableThrottleTracking + +`bool EnableThrottleTracking { get; set; }` + +Gets or sets a value indicating whether throttle tracking is enabled. +Default: true + +#### MaxRetryCount + +`int MaxRetryCount { get; set; }` + +Gets or sets the maximum retry attempts for transient failures. +Default: 3 + +#### MaxRetryDelay + +`TimeSpan MaxRetryDelay { get; set; }` + +Gets or sets the maximum delay between retries. +Default: 30 seconds + +#### RetryDelay + +`TimeSpan RetryDelay { get; set; }` + +Gets or sets the base delay between retries. +Default: 1 second + +#### UseExponentialBackoff + +`bool UseExponentialBackoff { get; set; }` + +Gets or sets a value indicating whether to use exponential backoff for retries. +Default: true + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/ServiceProtectionException.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/ServiceProtectionException.md new file mode 100644 index 0000000..8c20f33 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/ServiceProtectionException.md @@ -0,0 +1,108 @@ + + +# ServiceProtectionException + +- Namespace: `PPDS.Dataverse.Resilience` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Exception` +- Implements: `ISerializable` + +## Summary + +Exception thrown when a service protection limit is hit. + +## Members + +### Constructors + +#### ServiceProtectionException(string connectionName, TimeSpan retryAfter, int errorCode) + +`ServiceProtectionException(string connectionName, TimeSpan retryAfter, int errorCode)` + +Initializes a new instance of the `PPDS.Dataverse.Resilience.ServiceProtectionException` class. + +- Param `connectionName`: The connection that was throttled. + +- Param `retryAfter`: Time to wait before retrying. + +- Param `errorCode`: The error code from the service. + +#### ServiceProtectionException(string connectionName, TimeSpan retryAfter, int errorCode, Exception innerException) + +`ServiceProtectionException(string connectionName, TimeSpan retryAfter, int errorCode, Exception innerException)` + +Initializes a new instance of the `PPDS.Dataverse.Resilience.ServiceProtectionException` class. + +- Param `connectionName`: The connection that was throttled. + +- Param `retryAfter`: Time to wait before retrying. + +- Param `errorCode`: The error code from the service. + +- Param `innerException`: The inner exception. + +#### ServiceProtectionException(string message) + +`ServiceProtectionException(string message)` + +Initializes a new instance of the `PPDS.Dataverse.Resilience.ServiceProtectionException` class +with a custom message (used when all connections are throttled and tolerance is exceeded). + +- Param `message`: The exception message. + + +### Methods + +#### IsServiceProtectionError + +`bool IsServiceProtectionError(int errorCode)` + +Determines if an error code is a service protection error. + +- Param `errorCode`: The error code to check. + +- Returns: True if the error code indicates a service protection limit. + + +### Properties + +#### ConnectionName + +`string ConnectionName { get; }` + +Gets the name of the connection that was throttled. + +#### ErrorCode + +`int ErrorCode { get; }` + +Gets the error code from the service. + +#### RetryAfter + +`TimeSpan RetryAfter { get; }` + +Gets the time to wait before retrying. + + +### Fields + +#### ErrorCodeConcurrentRequestsExceeded + +`int ErrorCodeConcurrentRequestsExceeded` + +Error code for "Concurrent requests exceeded". + +#### ErrorCodeExecutionTimeExceeded + +`int ErrorCodeExecutionTimeExceeded` + +Error code for "Combined execution time exceeded". + +#### ErrorCodeRequestsExceeded + +`int ErrorCodeRequestsExceeded` + +Error code for "Number of requests exceeded". + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/ThrottleState.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/ThrottleState.md new file mode 100644 index 0000000..4739e76 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/ThrottleState.md @@ -0,0 +1,46 @@ + + +# ThrottleState + +- Namespace: `PPDS.Dataverse.Resilience` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Represents the throttle state for a connection. + +## Members + +### Properties + +#### ConnectionName + +`string ConnectionName { get; set; }` + +Gets or sets the connection name. + +#### ExpiresAt + +`DateTime ExpiresAt { get; set; }` + +Gets or sets when the throttle expires. + +#### IsExpired + +`bool IsExpired { get; }` + +Gets a value indicating whether the throttle has expired. + +#### RetryAfter + +`TimeSpan RetryAfter { get; set; }` + +Gets or sets the retry-after duration. + +#### ThrottledAt + +`DateTime ThrottledAt { get; set; }` + +Gets or sets when the throttle was recorded. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/ThrottleTracker.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/ThrottleTracker.md new file mode 100644 index 0000000..09852cb --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Resilience/ThrottleTracker.md @@ -0,0 +1,103 @@ + + +# ThrottleTracker + +- Namespace: `PPDS.Dataverse.Resilience` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Implements: `IThrottleTracker` + +## Summary + +Tracks throttle state for connections using a thread-safe concurrent dictionary. + +## Members + +### Constructors + +#### ThrottleTracker(ILogger logger) + +`ThrottleTracker(ILogger logger)` + +Initializes a new instance of the `PPDS.Dataverse.Resilience.ThrottleTracker` class. + +- Param `logger`: Logger instance. + + +### Methods + +#### ClearThrottle + +`void ClearThrottle(string connectionName)` + +Clears throttle state for a connection. + +- Param `connectionName`: The connection to clear. + +#### GetShortestExpiry + +`TimeSpan GetShortestExpiry()` + +Gets the shortest time until any throttled connection expires. +Returns `System.TimeSpan.Zero` if no connections are throttled. + +- Returns: The shortest time until a throttle expires, or `System.TimeSpan.Zero` if none are throttled. + +#### GetThrottleExpiry + +`Nullable GetThrottleExpiry(string connectionName)` + +Gets when a connection's throttle expires. + +- Param `connectionName`: The connection to check. + +- Returns: The expiry time, or null if not throttled. + +#### IsThrottled + +`bool IsThrottled(string connectionName)` + +Checks if a connection is currently throttled. + +- Param `connectionName`: The connection to check. + +- Returns: True if the connection is throttled. + +#### RecordThrottle + +`void RecordThrottle(string connectionName, TimeSpan retryAfter)` + +Records a throttle event for a connection. + +- Param `connectionName`: The connection that was throttled. + +- Param `retryAfter`: How long to wait before retrying. + + +### Properties + +#### ThrottledConnectionCount + +`int ThrottledConnectionCount { get; }` + +Gets the number of currently throttled connections. + +#### ThrottledConnections + +`IReadOnlyCollection ThrottledConnections { get; }` + +Gets the names of all currently throttled connections. + +#### TotalBackoffTime + +`TimeSpan TotalBackoffTime { get; }` + +Gets the total backoff time accumulated from all throttle events. +This represents the sum of all RetryAfter durations, not actual time spent waiting. + +#### TotalThrottleEvents + +`long TotalThrottleEvents { get; }` + +Gets the total number of throttle events recorded. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Security/ConnectionStringRedactor.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Security/ConnectionStringRedactor.md new file mode 100644 index 0000000..2ca4535 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Security/ConnectionStringRedactor.md @@ -0,0 +1,56 @@ + + +# ConnectionStringRedactor + +- Namespace: `PPDS.Dataverse.Security` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Provides utilities for redacting sensitive information from connection strings +before logging or displaying to users. + +## Members + +### Methods + +#### ContainsSensitiveData + +`bool ContainsSensitiveData(string value)` + +Checks if a string appears to contain a connection string with sensitive data. + +- Param `value`: The string to check. + +- Returns: True if the string appears to contain sensitive connection string data. + +#### Redact + +`string Redact(string connectionString)` + +Redacts sensitive values from a connection string. + +- Param `connectionString`: The connection string to redact. + +- Returns: The connection string with sensitive values replaced by `PPDS.Dataverse.Security.ConnectionStringRedactor.RedactedPlaceholder`. + +#### RedactExceptionMessage + +`string RedactExceptionMessage(string message)` + +Redacts sensitive values from an exception message that may contain connection string data. + +- Param `message`: The exception message to redact. + +- Returns: The message with sensitive values redacted. + + +### Fields + +#### RedactedPlaceholder + +`string RedactedPlaceholder` + +The placeholder text used to replace sensitive values. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Security/DataverseConnectionException.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Security/DataverseConnectionException.md new file mode 100644 index 0000000..372a971 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Security/DataverseConnectionException.md @@ -0,0 +1,97 @@ + + +# DataverseConnectionException + +- Namespace: `PPDS.Dataverse.Security` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Exception` +- Implements: `ISerializable` + +## Summary + +Exception thrown when a Dataverse connection fails. +This exception sanitizes error messages to prevent connection string secrets from leaking. + +## Members + +### Constructors + +#### DataverseConnectionException() + +`DataverseConnectionException()` + +Initializes a new instance of the `PPDS.Dataverse.Security.DataverseConnectionException` class. + +#### DataverseConnectionException(string connectionName, string message, Exception innerException) + +`DataverseConnectionException(string connectionName, string message, Exception innerException)` + +Initializes a new instance of the `PPDS.Dataverse.Security.DataverseConnectionException` class. + +- Param `connectionName`: The name of the connection configuration that failed. + +- Param `message`: The error message (will be redacted if it contains sensitive data). + +- Param `innerException`: The original exception that caused this error. + +#### DataverseConnectionException(string message) + +`DataverseConnectionException(string message)` + +Initializes a new instance of the `PPDS.Dataverse.Security.DataverseConnectionException` class. + +- Param `message`: The error message (will be redacted if it contains sensitive data). + +#### DataverseConnectionException(string message, Exception innerException) + +`DataverseConnectionException(string message, Exception innerException)` + +Initializes a new instance of the `PPDS.Dataverse.Security.DataverseConnectionException` class. + +- Param `message`: The error message (will be redacted if it contains sensitive data). + +- Param `innerException`: The original exception that caused this error. + + +### Methods + +#### CreateAuthenticationFailed + +`DataverseConnectionException CreateAuthenticationFailed(string connectionName, Exception innerException)` + +Creates a connection exception for an authentication failure. + +- Param `connectionName`: The name of the connection configuration. + +- Param `innerException`: The original exception from the authentication attempt. + +- Returns: A sanitized exception safe for logging. + +#### CreateConnectionFailed + +`DataverseConnectionException CreateConnectionFailed(string connectionName, Exception innerException)` + +Creates a connection exception for a failed connection attempt. + +- Param `connectionName`: The name of the connection configuration. + +- Param `innerException`: The original exception from the connection attempt. + +- Returns: A sanitized exception safe for logging. + +#### ToString + +`string ToString()` + +*(inherited from `System.Exception.ToString`)* + + +### Properties + +#### ConnectionName + +`string ConnectionName { get; }` + +Gets the name of the connection configuration that failed. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Security/SensitiveDataAttribute.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Security/SensitiveDataAttribute.md new file mode 100644 index 0000000..5e63619 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Security/SensitiveDataAttribute.md @@ -0,0 +1,48 @@ + + +# SensitiveDataAttribute + +- Namespace: `PPDS.Dataverse.Security` +- Assembly: `PPDS.Dataverse` +- Kind: Class +- Base: `Attribute` + +## Summary + +Marks a property or field as containing sensitive data that should not be logged or displayed. +This attribute serves as documentation and can be used by static analysis tools or +custom serializers to identify data requiring redaction. + +## Members + +### Constructors + +#### SensitiveDataAttribute() + +`SensitiveDataAttribute()` + +Initializes a new instance of the `PPDS.Dataverse.Security.SensitiveDataAttribute` class. + +#### SensitiveDataAttribute(string reason) + +`SensitiveDataAttribute(string reason)` + +Initializes a new instance of the `PPDS.Dataverse.Security.SensitiveDataAttribute` class. + +- Param `reason`: A description of why this data is sensitive. + + +### Properties + +#### DataType + +`string DataType { get; set; }` + +Gets or sets the type of sensitive data (e.g., "ConnectionString", "ApiKey", "Password"). + +#### Reason + +`string Reason { get; set; }` + +Gets or sets a description of why this data is sensitive. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/ISourceTokenizer.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/ISourceTokenizer.md new file mode 100644 index 0000000..972884c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/ISourceTokenizer.md @@ -0,0 +1,28 @@ + + +# ISourceTokenizer + +- Namespace: `PPDS.Dataverse.Sql.Intellisense` +- Assembly: `PPDS.Dataverse` +- Kind: Interface + +## Summary + +Produces source tokens for syntax highlighting. +Language-agnostic interface — implementations provide language-specific tokenization. + +## Members + +### Methods + +#### Tokenize + +`IReadOnlyList Tokenize(string text)` + +Tokenizes the given text into source tokens for syntax highlighting. +Must not throw — invalid input should produce Error tokens. + +- Param `text`: The source text to tokenize. + +- Returns: An ordered list of tokens covering the entire input text. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SourceToken.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SourceToken.md new file mode 100644 index 0000000..774c6fb --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SourceToken.md @@ -0,0 +1,52 @@ + + +# SourceToken + +- Namespace: `PPDS.Dataverse.Sql.Intellisense` +- Assembly: `PPDS.Dataverse` +- Kind: Struct +- Implements: `IEquatable` + +## Summary + +A token with position and classification for syntax highlighting. +Language-agnostic — the `PPDS.Dataverse.Sql.Intellisense.SourceTokenType` determines rendering color. + +## Members + +### Constructors + +#### SourceToken(int Start, int Length, SourceTokenType Type) + +`SourceToken(int Start, int Length, SourceTokenType Type)` + +A token with position and classification for syntax highlighting. +Language-agnostic — the `PPDS.Dataverse.Sql.Intellisense.SourceTokenType` determines rendering color. + +- Param `Start`: Character offset where the token begins in the source text. + +- Param `Length`: Number of characters in the token. + +- Param `Type`: The classification of the token for highlighting purposes. + + +### Properties + +#### Length + +`int Length { get; set; }` + +Number of characters in the token. + +#### Start + +`int Start { get; set; }` + +Character offset where the token begins in the source text. + +#### Type + +`SourceTokenType Type { get; set; }` + +The classification of the token for highlighting purposes. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SourceTokenType.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SourceTokenType.md new file mode 100644 index 0000000..87765ba --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SourceTokenType.md @@ -0,0 +1,77 @@ + + +# SourceTokenType + +- Namespace: `PPDS.Dataverse.Sql.Intellisense` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Language-agnostic source token classification for syntax highlighting. + +## Members + +### Fields + +#### Comment + +`SourceTokenType Comment` + +Comment (-- line or /* block */). + +#### Error + +`SourceTokenType Error` + +Error/unrecognized token. + +#### Function + +`SourceTokenType Function` + +Built-in function (COUNT, SUM, ROW_NUMBER, etc.). + +#### Identifier + +`SourceTokenType Identifier` + +Identifier (column name, table name, alias). + +#### Keyword + +`SourceTokenType Keyword` + +Language keyword (SELECT, FROM, WHERE, etc.). + +#### NumericLiteral + +`SourceTokenType NumericLiteral` + +Numeric literal (42, 3.14). + +#### Operator + +`SourceTokenType Operator` + +Operator (=, <>, +, -, etc.). + +#### Punctuation + +`SourceTokenType Punctuation` + +Punctuation (, . * ( ) ;). + +#### StringLiteral + +`SourceTokenType StringLiteral` + +String literal ('hello'). + +#### Variable + +`SourceTokenType Variable` + +Variable reference (@name). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlCompletion.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlCompletion.md new file mode 100644 index 0000000..7e00857 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlCompletion.md @@ -0,0 +1,74 @@ + + +# SqlCompletion + +- Namespace: `PPDS.Dataverse.Sql.Intellisense` +- Assembly: `PPDS.Dataverse` +- Kind: Record +- Implements: `IEquatable` + +## Summary + +A single completion item for SQL IntelliSense. + +## Members + +### Constructors + +#### SqlCompletion(string Label, string InsertText, SqlCompletionKind Kind, string Description, string Detail, int SortOrder) + +`SqlCompletion(string Label, string InsertText, SqlCompletionKind Kind, string Description, string Detail, int SortOrder)` + +A single completion item for SQL IntelliSense. + +- Param `Label`: Display label shown in the completion list. + +- Param `InsertText`: Text inserted when the completion is accepted. + +- Param `Kind`: The classification of this completion item. + +- Param `Description`: Optional description shown in a detail pane. + +- Param `Detail`: Optional short detail text (e.g., attribute type). + +- Param `SortOrder`: Sort priority (lower values appear first). + + +### Properties + +#### Description + +`string Description { get; set; }` + +Optional description shown in a detail pane. + +#### Detail + +`string Detail { get; set; }` + +Optional short detail text (e.g., attribute type). + +#### InsertText + +`string InsertText { get; set; }` + +Text inserted when the completion is accepted. + +#### Kind + +`SqlCompletionKind Kind { get; set; }` + +The classification of this completion item. + +#### Label + +`string Label { get; set; }` + +Display label shown in the completion list. + +#### SortOrder + +`int SortOrder { get; set; }` + +Sort priority (lower values appear first). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlCompletionContextKind.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlCompletionContextKind.md new file mode 100644 index 0000000..9b0c3cf --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlCompletionContextKind.md @@ -0,0 +1,41 @@ + + +# SqlCompletionContextKind + +- Namespace: `PPDS.Dataverse.Sql.Intellisense` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +The kind of completion context at a cursor position in SQL text. + +## Members + +### Fields + +#### Attribute + +`SqlCompletionContextKind Attribute` + +Attribute/column name completions. + +#### Entity + +`SqlCompletionContextKind Entity` + +Entity/table name completions. + +#### Keyword + +`SqlCompletionContextKind Keyword` + +SQL keyword completions (SELECT, FROM, WHERE, etc.). + +#### None + +`SqlCompletionContextKind None` + +No completions available at this position. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlCompletionKind.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlCompletionKind.md new file mode 100644 index 0000000..cc0ca68 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlCompletionKind.md @@ -0,0 +1,35 @@ + + +# SqlCompletionKind + +- Namespace: `PPDS.Dataverse.Sql.Intellisense` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +The kind of completion item in SQL IntelliSense results. + +## Members + +### Fields + +#### Attribute + +`SqlCompletionKind Attribute` + +Attribute/column name from Dataverse metadata. + +#### Entity + +`SqlCompletionKind Entity` + +Entity/table name from Dataverse metadata. + +#### Keyword + +`SqlCompletionKind Keyword` + +SQL keyword (SELECT, WHERE, JOIN, etc.). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlCursorContextResult.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlCursorContextResult.md new file mode 100644 index 0000000..88b8fd7 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlCursorContextResult.md @@ -0,0 +1,58 @@ + + +# SqlCursorContextResult + +- Namespace: `PPDS.Dataverse.Sql.Intellisense` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Result of cursor context analysis for SQL IntelliSense. +Describes what kind of completion is appropriate at the cursor position. + +## Members + +### Methods + +#### None + +`SqlCursorContextResult None()` + +Creates a result indicating no completions are available. + + +### Properties + +#### AliasMap + +`IReadOnlyDictionary AliasMap { get; set; }` + +Map of alias to entity logical name for all tables in scope. +Keys are aliases (or table names if no alias); values are entity logical names. + +#### CurrentEntity + +`string CurrentEntity { get; set; }` + +The entity logical name for attribute lookup when `PPDS.Dataverse.Sql.Intellisense.SqlCursorContextResult.Kind` is `PPDS.Dataverse.Sql.Intellisense.SqlCompletionContextKind.Attribute`. +Null means attributes from all in-scope entities should be shown. + +#### KeywordSuggestions + +`IReadOnlyList KeywordSuggestions { get; set; }` + +Context-filtered keyword suggestions when `PPDS.Dataverse.Sql.Intellisense.SqlCursorContextResult.Kind` is `PPDS.Dataverse.Sql.Intellisense.SqlCompletionContextKind.Keyword`. + +#### Kind + +`SqlCompletionContextKind Kind { get; set; }` + +The kind of completion appropriate at this cursor position. + +#### Prefix + +`string Prefix { get; set; }` + +The text prefix the user has already typed at the cursor position (for filtering). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlDiagnostic.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlDiagnostic.md new file mode 100644 index 0000000..bfb34a4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlDiagnostic.md @@ -0,0 +1,58 @@ + + +# SqlDiagnostic + +- Namespace: `PPDS.Dataverse.Sql.Intellisense` +- Assembly: `PPDS.Dataverse` +- Kind: Record +- Implements: `IEquatable` + +## Summary + +A diagnostic message for a region of SQL text (error, warning, or info). + +## Members + +### Constructors + +#### SqlDiagnostic(int Start, int Length, SqlDiagnosticSeverity Severity, string Message) + +`SqlDiagnostic(int Start, int Length, SqlDiagnosticSeverity Severity, string Message)` + +A diagnostic message for a region of SQL text (error, warning, or info). + +- Param `Start`: Character offset where the diagnostic starts. + +- Param `Length`: Number of characters the diagnostic spans. + +- Param `Severity`: The severity of the diagnostic. + +- Param `Message`: Human-readable description of the issue. + + +### Properties + +#### Length + +`int Length { get; set; }` + +Number of characters the diagnostic spans. + +#### Message + +`string Message { get; set; }` + +Human-readable description of the issue. + +#### Severity + +`SqlDiagnosticSeverity Severity { get; set; }` + +The severity of the diagnostic. + +#### Start + +`int Start { get; set; }` + +Character offset where the diagnostic starts. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlDiagnosticSeverity.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlDiagnosticSeverity.md new file mode 100644 index 0000000..5802f62 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Intellisense/SqlDiagnosticSeverity.md @@ -0,0 +1,35 @@ + + +# SqlDiagnosticSeverity + +- Namespace: `PPDS.Dataverse.Sql.Intellisense` +- Assembly: `PPDS.Dataverse` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Severity level for SQL diagnostics. + +## Members + +### Fields + +#### Error + +`SqlDiagnosticSeverity Error` + +Error that prevents execution. + +#### Info + +`SqlDiagnosticSeverity Info` + +Informational hint. + +#### Warning + +`SqlDiagnosticSeverity Warning` + +Warning about potential issues. + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Transpilation/TranspileResult.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Transpilation/TranspileResult.md new file mode 100644 index 0000000..863f6ad --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Transpilation/TranspileResult.md @@ -0,0 +1,38 @@ + + +# TranspileResult + +- Namespace: `PPDS.Dataverse.Sql.Transpilation` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Result of SQL to FetchXML transpilation, including virtual column metadata. + +## Members + +### Methods + +#### Simple + +`TranspileResult Simple(string fetchXml)` + +Creates a simple result with no virtual columns. + + +### Properties + +#### FetchXml + +`string FetchXml { get; set; }` + +The transpiled FetchXML string. + +#### VirtualColumns + +`IReadOnlyDictionary VirtualColumns { get; set; }` + +Virtual columns that were detected and need special handling. +Key is the virtual column name (e.g., "owneridname"), value is the base column name (e.g., "ownerid"). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Transpilation/VirtualColumnInfo.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Transpilation/VirtualColumnInfo.md new file mode 100644 index 0000000..3fed742 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/Sql/Transpilation/VirtualColumnInfo.md @@ -0,0 +1,35 @@ + + +# VirtualColumnInfo + +- Namespace: `PPDS.Dataverse.Sql.Transpilation` +- Assembly: `PPDS.Dataverse` +- Kind: Class + +## Summary + +Information about a virtual column (e.g., "owneridname" that maps to "ownerid"). + +## Members + +### Properties + +#### Alias + +`string Alias { get; set; }` + +The alias for the virtual column, if any. + +#### BaseColumnExplicitlyQueried + +`bool BaseColumnExplicitlyQueried { get; set; }` + +Whether the user also explicitly queried the base column. +If false, the base column should be hidden from results. + +#### BaseColumnName + +`string BaseColumnName { get; set; }` + +The base column name that provides the data (e.g., "ownerid"). + diff --git a/docs/reference/libraries/docs/reference/libraries/Dataverse/_index.md b/docs/reference/libraries/docs/reference/libraries/Dataverse/_index.md new file mode 100644 index 0000000..0f1deac --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Dataverse/_index.md @@ -0,0 +1,320 @@ + + +# Dataverse reference + +## Interfaces + +| Type | Summary | +|------|---------| +| [IBulkOperationExecutor](./BulkOperations/IBulkOperationExecutor.md) | Executes bulk operations using modern Dataverse APIs. | +| [ICachedMetadataProvider](./Metadata/ICachedMetadataProvider.md) | Provides cached access to Dataverse metadata for IntelliSense and entity browsing. | +| [IConnectionSelectionStrategy](./Pooling/Strategies/IConnectionSelectionStrategy.md) | Strategy for selecting which connection to use from the pool. | +| [IConnectionSource](./Pooling/IConnectionSource.md) | Provides a seed ServiceClient for the connection pool to clone. | +| [IDataverseClient](./Client/IDataverseClient.md) | Abstraction over ServiceClient providing core Dataverse operations. | +| [IDataverseConnectionPool](./Pooling/IDataverseConnectionPool.md) | Manages a pool of Dataverse connections with intelligent selection and lifecycle management. | +| [IMetadataAuthoringProgressReporter](./Metadata/Authoring/IMetadataAuthoringProgressReporter.md) | Lightweight progress reporter for metadata authoring operations. | +| [IMetadataQueryExecutor](./Metadata/IMetadataQueryExecutor.md) | Executes metadata queries against Dataverse, returning results as QueryRow format. | +| [IMetadataQueryService](./Metadata/IMetadataQueryService.md) | Provides access to Dataverse metadata for entity browsing and discovery. | +| [IPooledClient](./Pooling/IPooledClient.md) | A client obtained from the connection pool. | +| [IQueryExecutor](./Query/IQueryExecutor.md) | Executes FetchXML queries against Dataverse and returns structured results. | +| [IQueryPlanNode](./Query/Planning/IQueryPlanNode.md) | A node in the query execution plan tree (Volcano/iterator model). | +| [IQueryProgressReporter](./Query/Planning/IQueryProgressReporter.md) | Lightweight progress reporter for query plan execution. | +| [IScalarFunction](./Query/Execution/Functions/IScalarFunction.md) | A scalar function that accepts arguments and returns a single value. | +| [ISourceTokenizer](./Sql/Intellisense/ISourceTokenizer.md) | Produces source tokens for syntax highlighting. | +| [ITdsQueryExecutor](./Query/ITdsQueryExecutor.md) | Executes SQL queries against Dataverse's TDS Endpoint (read-only replica) | +| [IThrottleTracker](./Resilience/IThrottleTracker.md) | Tracks throttle state across connections. | + +## Classes + +| Type | Summary | +|------|---------| +| [AdaptiveAggregateScanNode](./Query/Planning/Nodes/AdaptiveAggregateScanNode.md) | Wraps a FetchXML aggregate scan with adaptive retry. When the Dataverse | +| [AdaptiveBatchSizer](./BulkOperations/AdaptiveBatchSizer.md) | Dynamically adjusts DML batch size based on observed execution times. | +| [AdaptiveThrottleManager](./BulkOperations/AdaptiveThrottleManager.md) | Dynamically adjusts the degree of parallelism (DOP) for bulk DML operations | +| [AddOptionValueRequest](./Metadata/Authoring/AddOptionValueRequest.md) | Request to add a new option value to an existing option set. | +| [AsyncOperation](./Generated/AsyncOperation.md) | Process whose execution can proceed independently or in the background. | +| [AttributeMetadataDto](./Metadata/Models/AttributeMetadataDto.md) | Detailed attribute metadata for entity browsing. | +| [AuthenticationErrorDetector](./Resilience/AuthenticationErrorDetector.md) | Detects authentication and authorization failures from Dataverse operations. | +| [BatchCoordinatorExhaustedException](./BulkOperations/BatchCoordinatorExhaustedException.md) | Thrown when batch coordinator cannot acquire a slot within timeout. | +| [BatchFailureDiagnostic](./BulkOperations/BatchFailureDiagnostic.md) | Diagnostic information for identifying the cause of a batch failure. | +| [BatchParallelismCoordinator](./BulkOperations/BatchParallelismCoordinator.md) | Coordinates batch parallelism across all concurrent bulk operations. | +| [BulkOperationError](./BulkOperations/BulkOperationError.md) | Error details for a failed record in a bulk operation. | +| [BulkOperationErrorCode](./BulkOperations/BulkOperationErrorCode.md) | Structured error codes for bulk operation validation failures. | +| [BulkOperationExecutor](./BulkOperations/BulkOperationExecutor.md) | Executes bulk operations using modern Dataverse APIs. | +| [BulkOperationOptions](./BulkOperations/BulkOperationOptions.md) | Configuration options for bulk operations. | +| [BulkOperationValidationException](./BulkOperations/BulkOperationValidationException.md) | Exception thrown when bulk operation configuration fails validation. | +| [CachedMetadataProvider](./Metadata/CachedMetadataProvider.md) | Provides cached access to Dataverse metadata, wrapping `PPDS.Dataverse.Metadata.IMetadataQueryService` | +| [CascadeConfigurationDto](./Metadata/Authoring/CascadeConfigurationDto.md) | Defines the cascade behavior configuration for a relationship. | +| [CastConverter](./Query/Execution/Functions/CastConverter.md) | Implements T-SQL CAST/CONVERT type conversion semantics. | +| [ClientAggregateColumn](./Query/Planning/Nodes/ClientAggregateColumn.md) | Describes an aggregate column for client-side computation. | +| [ClientAggregateNode](./Query/Planning/Nodes/ClientAggregateNode.md) | Computes aggregate functions client-side from raw (non-aggregated) input rows. | +| [ClientFilterNode](./Query/Planning/Nodes/ClientFilterNode.md) | Filters rows by evaluating a condition client-side. | +| [ClientWindowNode](./Query/Planning/Nodes/ClientWindowNode.md) | Computes window functions (ROW_NUMBER, RANK, DENSE_RANK, aggregate OVER) client-side. | +| [CompiledPredicate](./Query/Execution/CompiledPredicate.md) | Compiled predicate: evaluates against a row and returns true/false. | +| [CompiledScalarExpression](./Query/Execution/CompiledScalarExpression.md) | Compiled scalar expression: evaluates against a row and returns a value. | +| [ConcatenateNode](./Query/Planning/Nodes/ConcatenateNode.md) | Concatenates rows from multiple child nodes sequentially. | +| [ConfigurationException](./Configuration/ConfigurationException.md) | Exception thrown when Dataverse configuration is invalid. | +| [ConnectionPoolOptions](./Pooling/ConnectionPoolOptions.md) | Configuration options for the Dataverse connection pool. | +| [ConnectionStatistics](./Pooling/ConnectionStatistics.md) | Statistics for a specific connection configuration. | +| [ConnectionStringBuilder](./Configuration/ConnectionStringBuilder.md) | Builds Dataverse connection strings from typed configuration. | +| [ConnectionStringRedactor](./Security/ConnectionStringRedactor.md) | Provides utilities for redacting sensitive information from connection strings | +| [ConnectionStringSource](./Pooling/ConnectionStringSource.md) | Connection source that creates a ServiceClient from connection string configuration. | +| [CorrelationIdScope](./Diagnostics/CorrelationIdScope.md) | Ambient correlation-ID scope shared by the CLI, the RPC daemon, and every | +| [CreateChoiceResult](./Metadata/Authoring/CreateChoiceResult.md) | Result of a create global choice operation. | +| [CreateColumnRequest](./Metadata/Authoring/CreateColumnRequest.md) | Request to create a new column (attribute) on a Dataverse table. | +| [CreateColumnResult](./Metadata/Authoring/CreateColumnResult.md) | Result of a create column operation. | +| [CreateGlobalChoiceRequest](./Metadata/Authoring/CreateGlobalChoiceRequest.md) | Request to create a new global choice (option set) in Dataverse. | +| [CreateKeyRequest](./Metadata/Authoring/CreateKeyRequest.md) | Request to create an alternate key on a Dataverse table. | +| [CreateKeyResult](./Metadata/Authoring/CreateKeyResult.md) | Result of a create alternate key operation. | +| [CreateManyToManyRequest](./Metadata/Authoring/CreateManyToManyRequest.md) | Request to create a many-to-many (N:N) relationship between two Dataverse tables. | +| [CreateOneToManyRequest](./Metadata/Authoring/CreateOneToManyRequest.md) | Request to create a one-to-many (1:N) relationship between two Dataverse tables. | +| [CreateRelationshipResult](./Metadata/Authoring/CreateRelationshipResult.md) | Result of a create relationship operation. | +| [CreateTableRequest](./Metadata/Authoring/CreateTableRequest.md) | Request to create a new Dataverse table (entity). | +| [CreateTableResult](./Metadata/Authoring/CreateTableResult.md) | Result of a create table operation. | +| [CustomAPI](./Generated/CustomAPI.md) | Entity that defines a custom API | +| [CustomAPIRequestParameter](./Generated/CustomAPIRequestParameter.md) | Entity that defines a request parameter for a custom API | +| [CustomAPIResponseProperty](./Generated/CustomAPIResponseProperty.md) | Entity that defines a response property for a custom API | +| [DataverseAuthenticationException](./Resilience/DataverseAuthenticationException.md) | Exception thrown when a Dataverse operation fails due to authentication or authorization issues. | +| [DataverseClient](./Client/DataverseClient.md) | Implementation of `PPDS.Dataverse.Client.IDataverseClient` that wraps a `Microsoft.PowerPlatform.Dataverse.Client.ServiceClient`. | +| [DataverseClientOptions](./Client/DataverseClientOptions.md) | Options for configuring a Dataverse client request. | +| [DataverseConnection](./Pooling/DataverseConnection.md) | Configuration for a Dataverse connection (Application User / Service Principal). | +| [DataverseConnectionException](./Security/DataverseConnectionException.md) | Exception thrown when a Dataverse connection fails. | +| [DataverseConnectionPool](./Pooling/DataverseConnectionPool.md) | High-performance connection pool for Dataverse with multi-connection support. | +| [DataverseEnvironmentOptions](./Configuration/DataverseEnvironmentOptions.md) | Configuration for a named Dataverse environment. | +| [DataverseFunctions](./Query/Execution/Functions/DataverseFunctions.md) | Dataverse-specific functions evaluated client-side. | +| [DataverseMetadataQueryService](./Metadata/DataverseMetadataQueryService.md) | Provides access to Dataverse metadata using the SDK. | +| [DataverseOptions](./DependencyInjection/DataverseOptions.md) | Root configuration options for Dataverse connection pooling and operations. | +| [DateFunctions](./Query/Execution/Functions/DateFunctions.md) | T-SQL date/time functions evaluated client-side. | +| [DateRangePartition](./Query/Planning/Partitioning/DateRangePartition.md) | A single date range partition with non-overlapping boundaries. | +| [DateRangePartitioner](./Query/Planning/Partitioning/DateRangePartitioner.md) | Generates non-overlapping date range partitions for splitting aggregate queries | +| [DeleteColumnRequest](./Metadata/Authoring/DeleteColumnRequest.md) | Request to delete a column (attribute) from a Dataverse table. | +| [DeleteDryRunResult](./Metadata/Authoring/DeleteDryRunResult.md) | Result of a delete dry-run operation, listing dependencies that would block deletion. | +| [DeleteGlobalChoiceRequest](./Metadata/Authoring/DeleteGlobalChoiceRequest.md) | Request to delete a global choice (option set) from Dataverse. | +| [DeleteKeyRequest](./Metadata/Authoring/DeleteKeyRequest.md) | Request to delete an alternate key from a Dataverse table. | +| [DeleteOptionValueRequest](./Metadata/Authoring/DeleteOptionValueRequest.md) | Request to delete an option value from an option set. | +| [DeleteRelationshipRequest](./Metadata/Authoring/DeleteRelationshipRequest.md) | Request to delete a Dataverse relationship. | +| [DeleteTableRequest](./Metadata/Authoring/DeleteTableRequest.md) | Request to delete a Dataverse table (entity). | +| [DependencyInfo](./Metadata/Authoring/DependencyInfo.md) | Describes a single component dependency found during a delete dry-run. | +| [DistinctNode](./Query/Planning/Nodes/DistinctNode.md) | Deduplicates rows from a single input using a composite key hash set. | +| [DmlExecuteNode](./Query/Planning/Nodes/DmlExecuteNode.md) | Executes DML operations (INSERT, UPDATE, DELETE) using BulkOperationExecutor. | +| [DmlValueCoercer](./Query/DmlValueCoercer.md) | Coerces raw CLR values from SQL DML into Dataverse SDK-typed values | +| [EntityDataProvider](./Generated/EntityDataProvider.md) | Developers can register plug-ins on a data provider to enable data access for virtual entities in the system. | +| [EntityKeyDto](./Metadata/Models/EntityKeyDto.md) | Represents an alternate key definition for an entity. | +| [EntityMetadataDto](./Metadata/Models/EntityMetadataDto.md) | Full entity metadata including attributes, relationships, keys, and privileges. | +| [EntityRelationshipsDto](./Metadata/Models/EntityRelationshipsDto.md) | Container for all relationship types for an entity. | +| [EntitySummary](./Metadata/Models/EntitySummary.md) | Summary information for an entity in list views. | +| [EnvironmentResolver](./Configuration/EnvironmentResolver.md) | Resolves named environments from DataverseOptions. | +| [EnvironmentVariableDefinition](./Generated/EnvironmentVariableDefinition.md) | Contains information about the settable variable: its type, default value, and etc. | +| [EnvironmentVariableValue](./Generated/EnvironmentVariableValue.md) | Holds the value for the associated EnvironmentVariableDefinition entity. | +| [ErrorFunctions](./Query/Execution/Functions/ErrorFunctions.md) | T-SQL error functions for TRY/CATCH blocks. | +| [FetchXmlScanNode](./Query/Planning/Nodes/FetchXmlScanNode.md) | Executes a FetchXML query and yields rows page-by-page. | +| [FunctionRegistry](./Query/Execution/Functions/FunctionRegistry.md) | Registry of scalar functions available for expression evaluation. | +| [ImportJob](./Generated/ImportJob.md) | For internal use only. | +| [JsonFunctions](./Query/Execution/Functions/JsonFunctions.md) | T-SQL JSON functions evaluated client-side using System.Text.Json. | +| [LeastConnectionsStrategy](./Pooling/Strategies/LeastConnectionsStrategy.md) | Selects the connection with the fewest active clients. | +| [ListResult`1](./Models/ListResult`1.md) | Wraps a list result with metadata about the total dataset. | +| [ManyToManyRelationshipDto](./Metadata/Models/ManyToManyRelationshipDto.md) | Represents a many-to-many relationship. | +| [MathFunctions](./Query/Execution/Functions/MathFunctions.md) | T-SQL math functions evaluated client-side. | +| [MergeAggregateColumn](./Query/Planning/Nodes/MergeAggregateColumn.md) | Describes an aggregate column to be merged. | +| [MergeAggregateNode](./Query/Planning/Nodes/MergeAggregateNode.md) | Merges partial aggregate results from parallel partitions. | +| [MetadataErrorCodes](./Metadata/Authoring/MetadataErrorCodes.md) | Machine-readable error codes for metadata authoring validation failures. | +| [MetadataQueryExecutor](./Metadata/MetadataQueryExecutor.md) | Queries Dataverse metadata via `PPDS.Dataverse.Metadata.IMetadataQueryService` and returns results | +| [MetadataScanNode](./Query/Planning/Nodes/MetadataScanNode.md) | Scan node that queries Dataverse metadata API instead of entity data. | +| [MetadataTableDefinitions](./Metadata/MetadataTableDefinitions.md) | Defines the schema of metadata virtual tables. | +| [MetadataValidationException](./Metadata/Authoring/MetadataValidationException.md) | Thrown when metadata authoring validation fails. | +| [NodeStatistics](./Query/Planning/NodeStatistics.md) | Statistics for a single plan node. Thread-safe via Interlocked operations. | +| [NullFunctions](./Query/Execution/Functions/NullFunctions.md) | T-SQL null-handling functions evaluated client-side. | +| [OptionDefinition](./Metadata/Authoring/OptionDefinition.md) | Defines a single option value for a choice or choices column. | +| [OptionSetMetadataDto](./Metadata/Models/OptionSetMetadataDto.md) | Full option set metadata including all values. | +| [OptionSetSummary](./Metadata/Models/OptionSetSummary.md) | Summary information for a global option set in list views. | +| [OptionValueDto](./Metadata/Models/OptionValueDto.md) | Represents a single option value in an option set. | +| [ParallelPartitionNode](./Query/Planning/Nodes/ParallelPartitionNode.md) | Executes child plan nodes in parallel, limited by pool capacity. | +| [PlanExecutor](./Query/Execution/PlanExecutor.md) | Executes a query plan by consuming the root node's IAsyncEnumerable | +| [PlanFormatter](./Query/Planning/PlanFormatter.md) | Formats an execution plan tree as indented text for EXPLAIN output. | +| [PluginAssembly](./Generated/PluginAssembly.md) | Assembly that contains one or more plug-in types. | +| [PluginTraceLog](./Generated/PluginTraceLog.md) | Trace and exception information generated by plug-ins and custom workflow activities. | +| [PluginType](./Generated/PluginType.md) | Type that inherits from the IPlugin interface and is contained within a plug-in assembly. | +| [PoolExhaustedException](./Pooling/PoolExhaustedException.md) | Exception thrown when the connection pool is exhausted and no connection | +| [PoolStatistics](./Pooling/PoolStatistics.md) | Statistics and health information for the connection pool. | +| [PooledClientExtensions](./Pooling/PooledClientExtensions.md) | Extension methods on `PPDS.Dataverse.Pooling.IPooledClient` for common Dataverse SDK operations | +| [PrefetchScanNode](./Query/Planning/Nodes/PrefetchScanNode.md) | Wraps any IQueryPlanNode to speculatively prefetch rows into a bounded buffer. | +| [PrivilegeDto](./Metadata/Models/PrivilegeDto.md) | Represents a security privilege for an entity. | +| [ProgressSnapshot](./Progress/ProgressSnapshot.md) | Immutable snapshot of progress state at a point in time. | +| [ProgressTracker](./Progress/ProgressTracker.md) | Thread-safe progress tracker for bulk operations. | +| [ProjectColumn](./Query/Planning/Nodes/ProjectColumn.md) | Defines a column in a ProjectNode's output. | +| [ProjectNode](./Query/Planning/Nodes/ProjectNode.md) | Maps input rows to output rows (column selection, renaming, expression evaluation). | +| [Publisher](./Generated/Publisher.md) | A publisher of a CRM solution. | +| [QueryColumn](./Query/QueryColumn.md) | Represents a column in a query result with its metadata. | +| [QueryErrorCode](./Query/Execution/QueryErrorCode.md) | Structured error codes for query execution failures. | +| [QueryExecutionException](./Query/Execution/QueryExecutionException.md) | Exception thrown during query plan execution with a structured error code. | +| [QueryExecutor](./Query/QueryExecutor.md) | Executes FetchXML queries against Dataverse using the connection pool. | +| [QueryPlanContext](./Query/Planning/QueryPlanContext.md) | Shared context for plan execution: pool, cancellation, statistics. | +| [QueryPlanDescription](./Query/Planning/QueryPlanDescription.md) | Describes an execution plan for display (EXPLAIN output). | +| [QueryPlanOptions](./Query/Planning/QueryPlanOptions.md) | Options for query plan construction. | +| [QueryPlanResult](./Query/Planning/QueryPlanResult.md) | The result of building an execution plan: the root plan node plus metadata | +| [QueryPlanStatistics](./Query/Planning/QueryPlanStatistics.md) | Mutable statistics collected during plan execution. | +| [QueryResult](./Query/QueryResult.md) | Represents the result of a query execution against Dataverse. | +| [QueryRow](./Query/Planning/QueryRow.md) | A single row flowing through the plan. Lightweight wrapper around column values. | +| [QueryValue](./Query/QueryValue.md) | Represents a value in a query result, including both the raw value | +| [ReactivateKeyRequest](./Metadata/Authoring/ReactivateKeyRequest.md) | Request to reactivate a failed alternate key on a Dataverse table. | +| [RelationshipMetadataDto](./Metadata/Models/RelationshipMetadataDto.md) | Represents a one-to-many or many-to-one relationship. | +| [RemoteScanNode](./Query/Planning/Nodes/RemoteScanNode.md) | Executes a FetchXML query against a remote environment's connection pool. | +| [ReorderOptionsRequest](./Metadata/Authoring/ReorderOptionsRequest.md) | Request to reorder the option values in an option set. | +| [ResilienceOptions](./Resilience/ResilienceOptions.md) | Configuration options for resilience and retry behavior. | +| [Role](./Generated/Role.md) | Grouping of security privileges. Users are assigned roles that authorize their access to the Microsoft CRM system. | +| [RoundRobinStrategy](./Pooling/Strategies/RoundRobinStrategy.md) | Simple round-robin rotation through available connections. | +| [SchemaValidator](./Metadata/Authoring/SchemaValidator.md) | Validates metadata authoring requests before SDK calls. | +| [SdkMessage](./Generated/SdkMessage.md) | Message that is supported by the SDK. | +| [SdkMessageFilter](./Generated/SdkMessageFilter.md) | Filter that defines which SDK messages are valid for each type of entity. | +| [SdkMessageProcessingStep](./Generated/SdkMessageProcessingStep.md) | Stage in the execution pipeline that a plug-in is to execute. | +| [SdkMessageProcessingStepImage](./Generated/SdkMessageProcessingStepImage.md) | Copy of an entity's attributes before or after the core system operation. | +| [SecretResolver](./Configuration/SecretResolver.md) | Resolves secrets from various sources. | +| [SeedInitializationResult](./Pooling/SeedInitializationResult.md) | Result of initializing a seed connection for a pool source. | +| [SensitiveDataAttribute](./Security/SensitiveDataAttribute.md) | Marks a property or field as containing sensitive data that should not be logged or displayed. | +| [ServiceClientSource](./Pooling/ServiceClientSource.md) | Connection source for pre-authenticated ServiceClients. | +| [ServiceCollectionExtensions](./DependencyInjection/ServiceCollectionExtensions.md) | Extension methods for configuring Dataverse services in an `Microsoft.Extensions.DependencyInjection.IServiceCollection`. | +| [ServiceEndpoint](./Generated/ServiceEndpoint.md) | Service endpoint that can be contacted. | +| [ServiceProtectionException](./Resilience/ServiceProtectionException.md) | Exception thrown when a service protection limit is hit. | +| [Solution](./Generated/Solution.md) | A solution which contains CRM customizations. | +| [SolutionComponent](./Generated/SolutionComponent.md) | A component of a CRM solution. | +| [SqlCursorContextResult](./Sql/Intellisense/SqlCursorContextResult.md) | Result of cursor context analysis for SQL IntelliSense. | +| [StringFunctions](./Query/Execution/Functions/StringFunctions.md) | T-SQL string functions evaluated client-side. | +| [SystemUser](./Generated/SystemUser.md) | Person with access to the Microsoft CRM system and who owns objects in the Microsoft CRM database. | +| [TdsCompatibilityChecker](./Query/TdsCompatibilityChecker.md) | Determines whether a SQL query can be executed via the Dataverse TDS Endpoint. | +| [TdsQueryExecutor](./Query/TdsQueryExecutor.md) | Executes SQL queries against Dataverse's TDS Endpoint using the SQL Server wire protocol. | +| [TdsScanNode](./Query/Planning/Nodes/TdsScanNode.md) | Executes a SQL query directly against the Dataverse TDS Endpoint. | +| [ThrottleAwareStrategy](./Pooling/Strategies/ThrottleAwareStrategy.md) | Avoids throttled connections and falls back to round-robin among available connections. | +| [ThrottleState](./Resilience/ThrottleState.md) | Represents the throttle state for a connection. | +| [ThrottleTracker](./Resilience/ThrottleTracker.md) | Tracks throttle state for connections using a thread-safe concurrent dictionary. | +| [TranspileResult](./Sql/Transpilation/TranspileResult.md) | Result of SQL to FetchXML transpilation, including virtual column metadata. | +| [UpdateColumnRequest](./Metadata/Authoring/UpdateColumnRequest.md) | Request to update an existing column (attribute) on a Dataverse table. | +| [UpdateGlobalChoiceRequest](./Metadata/Authoring/UpdateGlobalChoiceRequest.md) | Request to update an existing global choice (option set) in Dataverse. | +| [UpdateOptionValueRequest](./Metadata/Authoring/UpdateOptionValueRequest.md) | Request to update an existing option value in an option set. | +| [UpdateRelationshipRequest](./Metadata/Authoring/UpdateRelationshipRequest.md) | Request to update an existing Dataverse relationship. | +| [UpdateStateValueRequest](./Metadata/Authoring/UpdateStateValueRequest.md) | Request to update a state or status option value label. | +| [UpdateTableRequest](./Metadata/Authoring/UpdateTableRequest.md) | Request to update an existing Dataverse table (entity). | +| [ValidationMessage](./Metadata/Authoring/ValidationMessage.md) | Represents a validation message produced during a dry-run or schema authoring operation. | +| [VariableScope](./Query/Execution/VariableScope.md) | Manages SQL variable declarations and values. | +| [VirtualColumnInfo](./Sql/Transpilation/VirtualColumnInfo.md) | Information about a virtual column (e.g., "owneridname" that maps to "ownerid"). | +| [WebResource](./Generated/WebResource.md) | Data equivalent to files used in Web development. Web resources provide client-side components that are used to provide custom user interface elements. | +| [WindowDefinition](./Query/Planning/Nodes/WindowDefinition.md) | Defines a single window function to compute within a ClientWindowNode. | +| [Workflow](./Generated/Workflow.md) | Set of logical rules that define the steps necessary to automate a specific business process, task, or set of actions to be performed. | + +## Records + +| Type | Summary | +|------|---------| +| [BulkOperationResult](./BulkOperations/BulkOperationResult.md) | Result of a bulk operation. | +| [CompiledOrderByItem](./Query/Planning/Nodes/CompiledOrderByItem.md) | A compiled ORDER BY item used by window functions. Contains the column name for | +| [CompiledSetClause](./Query/Planning/Nodes/CompiledSetClause.md) | A compiled SET clause for UPDATE statements. | +| [QueryExecutionOptions](./Query/QueryExecutionOptions.md) | Per-query execution options that affect how the query is sent to Dataverse. | +| [SqlCompletion](./Sql/Intellisense/SqlCompletion.md) | A single completion item for SQL IntelliSense. | +| [SqlDiagnostic](./Sql/Intellisense/SqlDiagnostic.md) | A diagnostic message for a region of SQL text (error, warning, or info). | +| [VariableInfo](./Query/Execution/VariableInfo.md) | Information about a declared SQL variable. | + +## Structs + +| Type | Summary | +|------|---------| +| [SourceToken](./Sql/Intellisense/SourceToken.md) | A token with position and classification for syntax highlighting. | + +## Enums + +| Type | Summary | +|------|---------| +| [AggregateFunction](./Query/Planning/Nodes/AggregateFunction.md) | Aggregate functions supported by MergeAggregateNode. | +| [CascadeBehavior](./Metadata/Authoring/CascadeBehavior.md) | Defines the cascade behavior options for entity relationship actions. | +| [ClientAggregateFunction](./Query/Planning/Nodes/ClientAggregateFunction.md) | Aggregate functions supported by ClientAggregateNode. | +| [ConnectionSelectionStrategy](./Pooling/ConnectionSelectionStrategy.md) | Strategy for selecting which connection to use from the pool. | +| [CustomLogicBypass](./BulkOperations/CustomLogicBypass.md) | Specifies which custom business logic to bypass during bulk operations. | +| [DataverseAuthType](./Configuration/DataverseAuthType.md) | Authentication type for Dataverse connections. | +| [DmlOperation](./Query/Planning/Nodes/DmlOperation.md) | The type of DML operation. | +| [OAuthLoginPrompt](./Configuration/OAuthLoginPrompt.md) | OAuth login prompt behavior. | +| [QueryColumnType](./Query/QueryColumnType.md) | Represents the data type of a column in a query result. | +| [SchemaColumnType](./Metadata/Authoring/SchemaColumnType.md) | Defines the supported column types for schema authoring operations. | +| [SeedFailureReason](./Pooling/SeedFailureReason.md) | Categorized reasons for seed initialization failure. | +| [SourceTokenType](./Sql/Intellisense/SourceTokenType.md) | Language-agnostic source token classification for syntax highlighting. | +| [SqlCompletionContextKind](./Sql/Intellisense/SqlCompletionContextKind.md) | The kind of completion context at a cursor position in SQL text. | +| [SqlCompletionKind](./Sql/Intellisense/SqlCompletionKind.md) | The kind of completion item in SQL IntelliSense results. | +| [SqlDiagnosticSeverity](./Sql/Intellisense/SqlDiagnosticSeverity.md) | Severity level for SQL diagnostics. | +| [TdsCompatibility](./Query/TdsCompatibility.md) | Result of a TDS Endpoint compatibility check. | +| [asyncoperation_operationtype](./Generated/asyncoperation_operationtype.md) | Type of the system job. | +| [asyncoperation_statecode](./Generated/asyncoperation_statecode.md) | Status of the system job. | +| [asyncoperation_statuscode](./Generated/asyncoperation_statuscode.md) | Reason for the status of the system job. | +| [componentstate](./Generated/componentstate.md) | The state of this component. | +| [componenttype](./Generated/componenttype.md) | All of the possible component types for solutions. | +| [connectionreference_promptingbehavior](./Generated/connectionreference_promptingbehavior.md) | This field configures how this connection reference gets prompted | +| [connectionreference_statecode](./Generated/connectionreference_statecode.md) | Status of the Connection Reference | +| [connectionreference_statuscode](./Generated/connectionreference_statuscode.md) | Reason for the status of the Connection Reference | +| [customapi_allowedcustomprocessingsteptype](./Generated/customapi_allowedcustomprocessingsteptype.md) | The Allowed Custom Processing Step Type | +| [customapi_statecode](./Generated/customapi_statecode.md) | Status of the Custom API | +| [customapi_statuscode](./Generated/customapi_statuscode.md) | Reason for the status of the Custom API | +| [customapifieldtype](./Generated/customapifieldtype.md) | Custom API Field Types | +| [customapirequestparameter_statecode](./Generated/customapirequestparameter_statecode.md) | Status of the Custom API Request Parameter | +| [customapirequestparameter_statuscode](./Generated/customapirequestparameter_statuscode.md) | Reason for the status of the Custom API Request Parameter | +| [customapiresponseproperty_statecode](./Generated/customapiresponseproperty_statecode.md) | Status of the Custom API Response Property | +| [customapiresponseproperty_statuscode](./Generated/customapiresponseproperty_statuscode.md) | Reason for the status of the Custom API Response Property | +| [environmentvariabledefinition_secretstore](./Generated/environmentvariabledefinition_secretstore.md) | The secret store where the secret is persisted. | +| [environmentvariabledefinition_statecode](./Generated/environmentvariabledefinition_statecode.md) | Status of the Environment Variable Definition | +| [environmentvariabledefinition_statuscode](./Generated/environmentvariabledefinition_statuscode.md) | Reason for the status of the Environment Variable Definition | +| [environmentvariablevalue_statecode](./Generated/environmentvariablevalue_statecode.md) | Status of the Environment Variable Value | +| [environmentvariablevalue_statuscode](./Generated/environmentvariablevalue_statuscode.md) | Reason for the status of the Environment Variable Value | +| [isinherited](./Generated/isinherited.md) | The role is inherited | +| [pluginassembly_authtype](./Generated/pluginassembly_authtype.md) | Authentication Type for the Web sources like AzureWebApp, for example 0=BasicAuth | +| [pluginassembly_isolationmode](./Generated/pluginassembly_isolationmode.md) | Information about how the plugin assembly is to be isolated at execution time; None / Sandboxed / External. | +| [pluginassembly_sourcetype](./Generated/pluginassembly_sourcetype.md) | Location of the assembly, for example 0=database, 1=on-disk, 2=Normal, 3=AzureWebApp. | +| [pluginpackage_statecode](./Generated/pluginpackage_statecode.md) | Status of the Plugin Package | +| [pluginpackage_statuscode](./Generated/pluginpackage_statuscode.md) | Reason for the status of the Plugin Package | +| [plugintracelog_mode](./Generated/plugintracelog_mode.md) | Type of Execution | +| [plugintracelog_operationtype](./Generated/plugintracelog_operationtype.md) | Type of Plugin | +| [publisher_address1_addresstypecode](./Generated/publisher_address1_addresstypecode.md) | Type of address for address 1, such as billing, shipping, or primary address. | +| [publisher_address1_shippingmethodcode](./Generated/publisher_address1_shippingmethodcode.md) | Method of shipment for address 1. | +| [publisher_address2_addresstypecode](./Generated/publisher_address2_addresstypecode.md) | Type of address for address 2. such as billing, shipping, or primary address. | +| [publisher_address2_shippingmethodcode](./Generated/publisher_address2_shippingmethodcode.md) | Method of shipment for address 2. | +| [sdkmessageprocessingstep_invocationsource](./Generated/sdkmessageprocessingstep_invocationsource.md) | Identifies if a plug-in should be executed from a parent pipeline, a child pipeline, or both. | +| [sdkmessageprocessingstep_mode](./Generated/sdkmessageprocessingstep_mode.md) | Run-time mode of execution, for example, synchronous or asynchronous. | +| [sdkmessageprocessingstep_stage](./Generated/sdkmessageprocessingstep_stage.md) | Stage in the execution pipeline that the SDK message processing step is in. | +| [sdkmessageprocessingstep_statecode](./Generated/sdkmessageprocessingstep_statecode.md) | Status of the SDK message processing step. | +| [sdkmessageprocessingstep_statuscode](./Generated/sdkmessageprocessingstep_statuscode.md) | Reason for the status of the SDK message processing step. | +| [sdkmessageprocessingstep_supporteddeployment](./Generated/sdkmessageprocessingstep_supporteddeployment.md) | Deployment that the SDK message processing step should be executed on; server, client, or both. | +| [sdkmessageprocessingstepimage_imagetype](./Generated/sdkmessageprocessingstepimage_imagetype.md) | Type of image requested. | +| [securityrole_isautoassigned](./Generated/securityrole_isautoassigned.md) | Value indicating whether security role is auto-assigned based on user license | +| [serviceendpoint_authtype](./Generated/serviceendpoint_authtype.md) | Authentication type for Service Bus | +| [serviceendpoint_connectionmode](./Generated/serviceendpoint_connectionmode.md) | Connection mode. | +| [serviceendpoint_contract](./Generated/serviceendpoint_contract.md) | Contract type. | +| [serviceendpoint_messagecharset](./Generated/serviceendpoint_messagecharset.md) | Character encoding used for messages sent to a service endpoint | +| [serviceendpoint_messageformat](./Generated/serviceendpoint_messageformat.md) | Format type. | +| [serviceendpoint_namespaceformat](./Generated/serviceendpoint_namespaceformat.md) | Format for Service Bus Namespace | +| [serviceendpoint_schematype](./Generated/serviceendpoint_schematype.md) | Schema type for Event Grid | +| [serviceendpoint_userclaim](./Generated/serviceendpoint_userclaim.md) | User claim value type. | +| [solution_solutiontype](./Generated/solution_solutiontype.md) | All possible types of solution | +| [solutioncomponent_rootcomponentbehavior](./Generated/solutioncomponent_rootcomponentbehavior.md) | Indicates the include behavior of the root component. | +| [systemuser_accessmode](./Generated/systemuser_accessmode.md) | Type of user. | +| [systemuser_address1_addresstypecode](./Generated/systemuser_address1_addresstypecode.md) | Type of address for address 1, such as billing, shipping, or primary address. | +| [systemuser_address1_shippingmethodcode](./Generated/systemuser_address1_shippingmethodcode.md) | Method of shipment for address 1. | +| [systemuser_address2_addresstypecode](./Generated/systemuser_address2_addresstypecode.md) | Type of address for address 2, such as billing, shipping, or primary address. | +| [systemuser_address2_shippingmethodcode](./Generated/systemuser_address2_shippingmethodcode.md) | Method of shipment for address 2. | +| [systemuser_azurestate](./Generated/systemuser_azurestate.md) | Azure state of user. | +| [systemuser_caltype](./Generated/systemuser_caltype.md) | License type of user. This is used only in the on-premises version of the product. Online licenses are managed through Microsoft 365 Office Portal. | +| [systemuser_deletestate](./Generated/systemuser_deletestate.md) | User delete state. | +| [systemuser_emailrouteraccessapproval](./Generated/systemuser_emailrouteraccessapproval.md) | Indicates the approval options for server-side synchronization or Email Router access. | +| [systemuser_incomingemaildeliverymethod](./Generated/systemuser_incomingemaildeliverymethod.md) | Incoming email delivery method for the user. | +| [systemuser_invitestatuscode](./Generated/systemuser_invitestatuscode.md) | User invitation status. | +| [systemuser_outgoingemaildeliverymethod](./Generated/systemuser_outgoingemaildeliverymethod.md) | Outgoing email delivery method for the user. | +| [systemuser_preferredaddresscode](./Generated/systemuser_preferredaddresscode.md) | Preferred address for the user. | +| [systemuser_preferredemailcode](./Generated/systemuser_preferredemailcode.md) | Preferred email address for the user. | +| [systemuser_preferredphonecode](./Generated/systemuser_preferredphonecode.md) | Preferred phone number for the user. | +| [systemuser_systemmanagedusertype](./Generated/systemuser_systemmanagedusertype.md) | The type of user | +| [workflow_businessprocesstype](./Generated/workflow_businessprocesstype.md) | Business Process Type. | +| [workflow_category](./Generated/workflow_category.md) | Category of the process. | +| [workflow_mode](./Generated/workflow_mode.md) | Mode of the process. | +| [workflow_modernflowtype](./Generated/workflow_modernflowtype.md) | Type of the Modern Flow process. | +| [workflow_runas](./Generated/workflow_runas.md) | Specifies the system user account under which a workflow executes | +| [workflow_scope](./Generated/workflow_scope.md) | Workflow scope. | +| [workflow_stage](./Generated/workflow_stage.md) | Stage in which the Workflow executes | +| [workflow_statecode](./Generated/workflow_statecode.md) | Status of the workflow | +| [workflow_statuscode](./Generated/workflow_statuscode.md) | Reason for the status of the workflow | +| [workflow_throttlingbehaviortype](./Generated/workflow_throttlingbehaviortype.md) | Type of workflow throttling behavior. | +| [workflow_type](./Generated/workflow_type.md) | Workflow type. | +| [workflow_uiflowtype](./Generated/workflow_uiflowtype.md) | Type of the UI Flow process. | + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Analysis/DependencyGraphBuilder.md b/docs/reference/libraries/docs/reference/libraries/Migration/Analysis/DependencyGraphBuilder.md new file mode 100644 index 0000000..41f1e8c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Analysis/DependencyGraphBuilder.md @@ -0,0 +1,44 @@ + + +# DependencyGraphBuilder + +- Namespace: `PPDS.Migration.Analysis` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IDependencyGraphBuilder` + +## Summary + +Builds entity dependency graphs using Tarjan's algorithm for cycle detection. + +## Members + +### Constructors + +#### DependencyGraphBuilder() + +`DependencyGraphBuilder()` + +Initializes a new instance of the `PPDS.Migration.Analysis.DependencyGraphBuilder` class. + +#### DependencyGraphBuilder(ILogger logger) + +`DependencyGraphBuilder(ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Analysis.DependencyGraphBuilder` class. + +- Param `logger`: The logger. + + +### Methods + +#### Build + +`DependencyGraph Build(MigrationSchema schema)` + +Analyzes a schema and builds a dependency graph. + +- Param `schema`: The migration schema. + +- Returns: The dependency graph with topologically sorted tiers. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Analysis/ExecutionPlanBuilder.md b/docs/reference/libraries/docs/reference/libraries/Migration/Analysis/ExecutionPlanBuilder.md new file mode 100644 index 0000000..27d0667 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Analysis/ExecutionPlanBuilder.md @@ -0,0 +1,46 @@ + + +# ExecutionPlanBuilder + +- Namespace: `PPDS.Migration.Analysis` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IExecutionPlanBuilder` + +## Summary + +Builds execution plans with deferred field identification. + +## Members + +### Constructors + +#### ExecutionPlanBuilder() + +`ExecutionPlanBuilder()` + +Initializes a new instance of the `PPDS.Migration.Analysis.ExecutionPlanBuilder` class. + +#### ExecutionPlanBuilder(ILogger logger) + +`ExecutionPlanBuilder(ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Analysis.ExecutionPlanBuilder` class. + +- Param `logger`: The logger. + + +### Methods + +#### Build + +`ExecutionPlan Build(DependencyGraph graph, MigrationSchema schema)` + +Creates an execution plan from a dependency graph. + +- Param `graph`: The dependency graph. + +- Param `schema`: The migration schema. + +- Returns: The execution plan with tiers and deferred fields. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Analysis/IDependencyGraphBuilder.md b/docs/reference/libraries/docs/reference/libraries/Migration/Analysis/IDependencyGraphBuilder.md new file mode 100644 index 0000000..4e6d83f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Analysis/IDependencyGraphBuilder.md @@ -0,0 +1,26 @@ + + +# IDependencyGraphBuilder + +- Namespace: `PPDS.Migration.Analysis` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Interface for building entity dependency graphs from schemas. + +## Members + +### Methods + +#### Build + +`DependencyGraph Build(MigrationSchema schema)` + +Analyzes a schema and builds a dependency graph. + +- Param `schema`: The migration schema. + +- Returns: The dependency graph with topologically sorted tiers. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Analysis/IExecutionPlanBuilder.md b/docs/reference/libraries/docs/reference/libraries/Migration/Analysis/IExecutionPlanBuilder.md new file mode 100644 index 0000000..3da83a9 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Analysis/IExecutionPlanBuilder.md @@ -0,0 +1,28 @@ + + +# IExecutionPlanBuilder + +- Namespace: `PPDS.Migration.Analysis` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Interface for building execution plans from dependency graphs. + +## Members + +### Methods + +#### Build + +`ExecutionPlan Build(DependencyGraph graph, MigrationSchema schema)` + +Creates an execution plan from a dependency graph. + +- Param `graph`: The dependency graph. + +- Param `schema`: The migration schema. + +- Returns: The execution plan with tiers and deferred fields. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Constants/AttributeNames.md b/docs/reference/libraries/docs/reference/libraries/Migration/Constants/AttributeNames.md new file mode 100644 index 0000000..88c1f0c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Constants/AttributeNames.md @@ -0,0 +1,22 @@ + + +# AttributeNames + +- Namespace: `PPDS.Migration.Constants` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Dataverse attribute logical names used in migration operations. + +## Members + +### Fields + +#### IsDefault + +`string IsDefault` + +The logical name of the isdefault attribute. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Constants/EntityNames.md b/docs/reference/libraries/docs/reference/libraries/Migration/Constants/EntityNames.md new file mode 100644 index 0000000..fde07e7 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Constants/EntityNames.md @@ -0,0 +1,34 @@ + + +# EntityNames + +- Namespace: `PPDS.Migration.Constants` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Dataverse entity logical names used in migration operations. + +## Members + +### Fields + +#### BusinessUnit + +`string BusinessUnit` + +The logical name of the businessunit entity. + +#### SystemUser + +`string SystemUser` + +The logical name of the systemuser entity. + +#### Team + +`string Team` + +The logical name of the team entity. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/DependencyInjection/MigrationOptions.md b/docs/reference/libraries/docs/reference/libraries/Migration/DependencyInjection/MigrationOptions.md new file mode 100644 index 0000000..1551da2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/DependencyInjection/MigrationOptions.md @@ -0,0 +1,28 @@ + + +# MigrationOptions + +- Namespace: `PPDS.Migration.DependencyInjection` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Options for configuring migration services. + +## Members + +### Properties + +#### Export + +`ExportOptions Export { get; set; }` + +Gets or sets the export options. + +#### Import + +`ImportOptions Import { get; set; }` + +Gets or sets the import options. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/DependencyInjection/ServiceCollectionExtensions.md b/docs/reference/libraries/docs/reference/libraries/Migration/DependencyInjection/ServiceCollectionExtensions.md new file mode 100644 index 0000000..fd05f41 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/DependencyInjection/ServiceCollectionExtensions.md @@ -0,0 +1,38 @@ + + +# ServiceCollectionExtensions + +- Namespace: `PPDS.Migration.DependencyInjection` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Extension methods for registering migration services. + +## Members + +### Methods + +#### AddDataverseMigration + +`IServiceCollection AddDataverseMigration(IServiceCollection services)` + +Adds Dataverse migration services with default options. + +- Param `services`: The service collection. + +- Returns: The service collection for chaining. + +#### AddDataverseMigration + +`IServiceCollection AddDataverseMigration(IServiceCollection services, Action configure)` + +Adds Dataverse migration services to the service collection. + +- Param `services`: The service collection. + +- Param `configure`: Action to configure migration options. + +- Returns: The service collection for chaining. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Export/EntityExportResult.md b/docs/reference/libraries/docs/reference/libraries/Migration/Export/EntityExportResult.md new file mode 100644 index 0000000..4905f7f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Export/EntityExportResult.md @@ -0,0 +1,46 @@ + + +# EntityExportResult + +- Namespace: `PPDS.Migration.Export` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Result for a single entity export. + +## Members + +### Properties + +#### Duration + +`TimeSpan Duration { get; set; }` + +Gets or sets the export duration for this entity. + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the entity logical name. + +#### ErrorMessage + +`string ErrorMessage { get; set; }` + +Gets or sets the error message if export failed. + +#### RecordCount + +`int RecordCount { get; set; }` + +Gets or sets the number of records exported. + +#### Success + +`bool Success { get; set; }` + +Gets or sets whether this entity export was successful. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Export/ExportOptions.md b/docs/reference/libraries/docs/reference/libraries/Migration/Export/ExportOptions.md new file mode 100644 index 0000000..e6fdc95 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Export/ExportOptions.md @@ -0,0 +1,61 @@ + + +# ExportOptions + +- Namespace: `PPDS.Migration.Export` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Options for export operations. + +## Members + +### Properties + +#### DegreeOfParallelism + +`int DegreeOfParallelism { get; set; }` + +Gets or sets the degree of parallelism for entity export. +Default: ProcessorCount * 2 + +#### IncludeFileData + +`bool IncludeFileData { get; set; }` + +Gets or sets whether to include file column binary data in the export. +When true, file column data is downloaded and stored in the ZIP archive. +Default: false + +#### PageLevelParallelism + +`int PageLevelParallelism { get; set; }` + +Gets or sets the number of GUID range partitions per entity for page-level parallelism. +0 = auto (determined from record count), 1 = disabled (sequential only). +Default: 0 + +#### PageLevelParallelismThreshold + +`int PageLevelParallelismThreshold { get; set; }` + +Gets or sets the minimum record count before page-level parallelism activates. +Entities with fewer records than this threshold use sequential paging. +Default: 5000 + +#### PageSize + +`int PageSize { get; set; }` + +Gets or sets the page size for FetchXML queries. +Default: 5000 + +#### ProgressInterval + +`int ProgressInterval { get; set; }` + +Gets or sets the progress reporting interval in records. +Default: 100 + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Export/ExportResult.md b/docs/reference/libraries/docs/reference/libraries/Migration/Export/ExportResult.md new file mode 100644 index 0000000..dc1267d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Export/ExportResult.md @@ -0,0 +1,71 @@ + + +# ExportResult + +- Namespace: `PPDS.Migration.Export` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Result of an export operation. + +## Members + +### Properties + +#### Duration + +`TimeSpan Duration { get; set; }` + +Gets or sets the export duration. + +#### EntitiesExported + +`int EntitiesExported { get; set; }` + +Gets or sets the number of entities exported. + +#### EntityResults + +`IReadOnlyList EntityResults { get; set; }` + +Gets or sets the results per entity. + +#### Errors + +`IReadOnlyList Errors { get; set; }` + +Gets or sets any errors that occurred. + +#### OutputPath + +`string OutputPath { get; set; }` + +Gets or sets the output file path. + +#### RecordsExported + +`int RecordsExported { get; set; }` + +Gets or sets the total number of records exported. + +#### RecordsPerSecond + +`double RecordsPerSecond { get; }` + +Gets the average records per second. + +#### Success + +`bool Success { get; set; }` + +Gets or sets whether the export was successful. + +#### Warnings + +`IReadOnlyList Warnings { get; set; }` + +Gets or sets non-fatal warnings produced during export (e.g., count-query failures +that forced an entity to sequential export). + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Export/ExportWarningCodes.md b/docs/reference/libraries/docs/reference/libraries/Migration/Export/ExportWarningCodes.md new file mode 100644 index 0000000..c417333 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Export/ExportWarningCodes.md @@ -0,0 +1,22 @@ + + +# ExportWarningCodes + +- Namespace: `PPDS.Migration.Export` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Standard warning codes for export operations. + +## Members + +### Fields + +#### CountFailedSequentialFallback + +`string CountFailedSequentialFallback` + +Record count query failed, entity fell back to sequential export. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Export/GuidPartitioner.md b/docs/reference/libraries/docs/reference/libraries/Migration/Export/GuidPartitioner.md new file mode 100644 index 0000000..cef12a7 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Export/GuidPartitioner.md @@ -0,0 +1,26 @@ + + +# GuidPartitioner + +- Namespace: `PPDS.Migration.Export` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Splits the GUID space into non-overlapping ranges for parallel export. + +## Members + +### Methods + +#### CreatePartitions + +`GuidRange[] CreatePartitions(int partitionCount)` + +Creates non-overlapping GUID range partitions that cover the entire GUID space. + +- Param `partitionCount`: Number of partitions to create. + +- Returns: Array of GUID ranges where each range's upper bound equals the next range's lower bound. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Export/GuidRange.md b/docs/reference/libraries/docs/reference/libraries/Migration/Export/GuidRange.md new file mode 100644 index 0000000..5b93ea1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Export/GuidRange.md @@ -0,0 +1,53 @@ + + +# GuidRange + +- Namespace: `PPDS.Migration.Export` +- Assembly: `PPDS.Migration` +- Kind: Struct + +## Summary + +Represents a range of GUIDs for partitioned export queries. + +## Members + +### Constructors + +#### GuidRange(Nullable lowerBound, Nullable upperBound) + +`GuidRange(Nullable lowerBound, Nullable upperBound)` + +Initializes a new instance of the `PPDS.Migration.Export.GuidRange` struct. + +- Param `lowerBound`: Inclusive lower bound, or null for no lower bound. + +- Param `upperBound`: Exclusive upper bound, or null for no upper bound. + + +### Properties + +#### Full + +`GuidRange Full { get; }` + +A range covering the entire GUID space. + +#### IsFull + +`bool IsFull { get; }` + +True when the range covers the entire GUID space. + +#### LowerBound + +`Nullable LowerBound { get; }` + +Inclusive lower bound. Null means no lower bound (first partition). + +#### UpperBound + +`Nullable UpperBound { get; }` + +Exclusive upper bound. Null means no upper bound (last partition). + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Export/IExporter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Export/IExporter.md new file mode 100644 index 0000000..a3651a5 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Export/IExporter.md @@ -0,0 +1,52 @@ + + +# IExporter + +- Namespace: `PPDS.Migration.Export` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Interface for exporting data from Dataverse. + +## Members + +### Methods + +#### ExportAsync + +`Task ExportAsync(MigrationSchema schema, string outputPath, ExportOptions options, IProgressReporter progress, CancellationToken cancellationToken)` + +Exports data using a pre-parsed schema. + +- Param `schema`: The migration schema. + +- Param `outputPath`: Output ZIP file path. + +- Param `options`: Export options. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The export result. + +#### ExportAsync + +`Task ExportAsync(string schemaPath, string outputPath, ExportOptions options, IProgressReporter progress, CancellationToken cancellationToken)` + +Exports data based on a schema file. + +- Param `schemaPath`: Path to the schema.xml file. + +- Param `outputPath`: Output ZIP file path. + +- Param `options`: Export options. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The export result. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Export/ParallelExporter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Export/ParallelExporter.md new file mode 100644 index 0000000..2b41530 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Export/ParallelExporter.md @@ -0,0 +1,120 @@ + + +# ParallelExporter + +- Namespace: `PPDS.Migration.Export` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IExporter` + +## Summary + +Parallel exporter for Dataverse data. + +## Members + +### Constructors + +#### ParallelExporter(IDataverseConnectionPool connectionPool, ICmtSchemaReader schemaReader, ICmtDataWriter dataWriter) + +`ParallelExporter(IDataverseConnectionPool connectionPool, ICmtSchemaReader schemaReader, ICmtDataWriter dataWriter)` + +Initializes a new instance of the `PPDS.Migration.Export.ParallelExporter` class. + +- Param `connectionPool`: The connection pool. + +- Param `schemaReader`: The schema reader. + +- Param `dataWriter`: The data writer. + +#### ParallelExporter(IDataverseConnectionPool connectionPool, ICmtSchemaReader schemaReader, ICmtDataWriter dataWriter, FileColumnTransferHelper fileTransferHelper, IOptions migrationOptions, ILogger logger) + +`ParallelExporter(IDataverseConnectionPool connectionPool, ICmtSchemaReader schemaReader, ICmtDataWriter dataWriter, FileColumnTransferHelper fileTransferHelper, IOptions migrationOptions, ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Export.ParallelExporter` class. + +- Param `connectionPool`: The connection pool. + +- Param `schemaReader`: The schema reader. + +- Param `dataWriter`: The data writer. + +- Param `fileTransferHelper`: Optional file column transfer helper for downloading file data. + +- Param `migrationOptions`: Migration options from DI. + +- Param `logger`: The logger. + + +### Methods + +#### AddPartitionFilter + +`string AddPartitionFilter(string fetchXml, string primaryKeyField, GuidRange partition)` + +Adds GUID range filter conditions to FetchXML for partition-based export. + +- Param `fetchXml`: Base FetchXML query. + +- Param `primaryKeyField`: Primary key field name for the entity. + +- Param `partition`: GUID range to filter by. + +- Returns: Modified FetchXML with partition filter conditions. + +#### DeterminePartitionCount + +`int DeterminePartitionCount(long recordCount, ExportOptions options)` + +Determines the number of GUID range partitions to use for a single entity export. + +- Param `recordCount`: Approximate record count for the entity. + +- Param `options`: Export options controlling parallelism. + +- Returns: 1 for sequential export, or N for partitioned export. + +#### ExportAsync + +`Task ExportAsync(MigrationSchema schema, string outputPath, ExportOptions options, IProgressReporter progress, CancellationToken cancellationToken)` + +Exports data using a pre-parsed schema. + +- Param `schema`: The migration schema. + +- Param `outputPath`: Output ZIP file path. + +- Param `options`: Export options. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The export result. + +#### ExportAsync + +`Task ExportAsync(string schemaPath, string outputPath, ExportOptions options, IProgressReporter progress, CancellationToken cancellationToken)` + +Exports data based on a schema file. + +- Param `schemaPath`: Path to the schema.xml file. + +- Param `outputPath`: Output ZIP file path. + +- Param `options`: Export options. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The export result. + +#### SummarizeFilter + +`string SummarizeFilter(string fetchXmlFilter)` + +Summarizes a FetchXML filter into a human-readable description. +Extracts attribute/operator/value from condition elements. +Uses neutral separator since filters may mix AND/OR logic. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Formats/CmtDataReader.md b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/CmtDataReader.md new file mode 100644 index 0000000..ff3b07d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/CmtDataReader.md @@ -0,0 +1,66 @@ + + +# CmtDataReader + +- Namespace: `PPDS.Migration.Formats` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `ICmtDataReader` + +## Summary + +Reads CMT data.zip files. + +## Members + +### Constructors + +#### CmtDataReader(ICmtSchemaReader schemaReader) + +`CmtDataReader(ICmtSchemaReader schemaReader)` + +Initializes a new instance of the `PPDS.Migration.Formats.CmtDataReader` class. + +- Param `schemaReader`: The schema reader. + +#### CmtDataReader(ICmtSchemaReader schemaReader, ILogger logger) + +`CmtDataReader(ICmtSchemaReader schemaReader, ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Formats.CmtDataReader` class. + +- Param `schemaReader`: The schema reader. + +- Param `logger`: The logger. + + +### Methods + +#### ReadAsync + +`Task ReadAsync(Stream stream, IProgressReporter progress, CancellationToken cancellationToken)` + +Reads migration data from a stream. + +- Param `stream`: The stream containing the ZIP file. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The parsed migration data. + +#### ReadAsync + +`Task ReadAsync(string path, IProgressReporter progress, CancellationToken cancellationToken)` + +Reads migration data from a ZIP file. + +- Param `path`: The path to the data.zip file. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The parsed migration data. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Formats/CmtDataWriter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/CmtDataWriter.md new file mode 100644 index 0000000..6057f2d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/CmtDataWriter.md @@ -0,0 +1,62 @@ + + +# CmtDataWriter + +- Namespace: `PPDS.Migration.Formats` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `ICmtDataWriter` + +## Summary + +Writes CMT-compatible data.zip files. + +## Members + +### Constructors + +#### CmtDataWriter() + +`CmtDataWriter()` + +Initializes a new instance of the `PPDS.Migration.Formats.CmtDataWriter` class. + +#### CmtDataWriter(ILogger logger) + +`CmtDataWriter(ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Formats.CmtDataWriter` class. + +- Param `logger`: The logger. + + +### Methods + +#### WriteAsync + +`Task WriteAsync(MigrationData data, Stream stream, IProgressReporter progress, CancellationToken cancellationToken)` + +Writes migration data to a stream. + +- Param `data`: The migration data to write. + +- Param `stream`: The output stream. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +#### WriteAsync + +`Task WriteAsync(MigrationData data, string path, IProgressReporter progress, CancellationToken cancellationToken)` + +Writes migration data to a ZIP file. + +- Param `data`: The migration data to write. + +- Param `path`: The output ZIP file path. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Formats/CmtSchemaReader.md b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/CmtSchemaReader.md new file mode 100644 index 0000000..f1562aa --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/CmtSchemaReader.md @@ -0,0 +1,58 @@ + + +# CmtSchemaReader + +- Namespace: `PPDS.Migration.Formats` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `ICmtSchemaReader` + +## Summary + +Reads CMT schema.xml files. + +## Members + +### Constructors + +#### CmtSchemaReader() + +`CmtSchemaReader()` + +Initializes a new instance of the `PPDS.Migration.Formats.CmtSchemaReader` class. + +#### CmtSchemaReader(ILogger logger) + +`CmtSchemaReader(ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Formats.CmtSchemaReader` class. + +- Param `logger`: The logger. + + +### Methods + +#### ReadAsync + +`Task ReadAsync(Stream stream, CancellationToken cancellationToken)` + +Reads a schema from a stream. + +- Param `stream`: The stream containing schema XML. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The parsed migration schema. + +#### ReadAsync + +`Task ReadAsync(string path, CancellationToken cancellationToken)` + +Reads a schema from a file path. + +- Param `path`: The path to the schema.xml file. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The parsed migration schema. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Formats/CmtSchemaWriter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/CmtSchemaWriter.md new file mode 100644 index 0000000..cf91e9c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/CmtSchemaWriter.md @@ -0,0 +1,58 @@ + + +# CmtSchemaWriter + +- Namespace: `PPDS.Migration.Formats` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `ICmtSchemaWriter` + +## Summary + +Writes CMT-compatible schema files. + +## Members + +### Constructors + +#### CmtSchemaWriter() + +`CmtSchemaWriter()` + +Initializes a new instance of the `PPDS.Migration.Formats.CmtSchemaWriter` class. + +#### CmtSchemaWriter(ILogger logger) + +`CmtSchemaWriter(ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Formats.CmtSchemaWriter` class. + +- Param `logger`: The logger. + + +### Methods + +#### WriteAsync + +`Task WriteAsync(MigrationSchema schema, Stream stream, CancellationToken cancellationToken)` + +Writes a migration schema to a stream. + +- Param `schema`: The schema to write. + +- Param `stream`: The output stream. + +- Param `cancellationToken`: Cancellation token. + +#### WriteAsync + +`Task WriteAsync(MigrationSchema schema, string path, CancellationToken cancellationToken)` + +Writes a migration schema to a file. + +- Param `schema`: The schema to write. + +- Param `path`: The output file path. + +- Param `cancellationToken`: Cancellation token. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Formats/ICmtDataReader.md b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/ICmtDataReader.md new file mode 100644 index 0000000..b397125 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/ICmtDataReader.md @@ -0,0 +1,44 @@ + + +# ICmtDataReader + +- Namespace: `PPDS.Migration.Formats` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Interface for reading CMT data files. + +## Members + +### Methods + +#### ReadAsync + +`Task ReadAsync(Stream stream, IProgressReporter progress, CancellationToken cancellationToken)` + +Reads migration data from a stream. + +- Param `stream`: The stream containing the ZIP file. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The parsed migration data. + +#### ReadAsync + +`Task ReadAsync(string path, IProgressReporter progress, CancellationToken cancellationToken)` + +Reads migration data from a ZIP file. + +- Param `path`: The path to the data.zip file. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The parsed migration data. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Formats/ICmtDataWriter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/ICmtDataWriter.md new file mode 100644 index 0000000..d92f958 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/ICmtDataWriter.md @@ -0,0 +1,44 @@ + + +# ICmtDataWriter + +- Namespace: `PPDS.Migration.Formats` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Interface for writing CMT-compatible data files. + +## Members + +### Methods + +#### WriteAsync + +`Task WriteAsync(MigrationData data, Stream stream, IProgressReporter progress, CancellationToken cancellationToken)` + +Writes migration data to a stream. + +- Param `data`: The migration data to write. + +- Param `stream`: The output stream. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +#### WriteAsync + +`Task WriteAsync(MigrationData data, string path, IProgressReporter progress, CancellationToken cancellationToken)` + +Writes migration data to a ZIP file. + +- Param `data`: The migration data to write. + +- Param `path`: The output ZIP file path. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Formats/ICmtSchemaReader.md b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/ICmtSchemaReader.md new file mode 100644 index 0000000..d9b1003 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/ICmtSchemaReader.md @@ -0,0 +1,40 @@ + + +# ICmtSchemaReader + +- Namespace: `PPDS.Migration.Formats` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Interface for reading CMT schema files. + +## Members + +### Methods + +#### ReadAsync + +`Task ReadAsync(Stream stream, CancellationToken cancellationToken)` + +Reads a schema from a stream. + +- Param `stream`: The stream containing schema XML. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The parsed migration schema. + +#### ReadAsync + +`Task ReadAsync(string path, CancellationToken cancellationToken)` + +Reads a schema from a file path. + +- Param `path`: The path to the schema.xml file. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The parsed migration schema. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Formats/ICmtSchemaWriter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/ICmtSchemaWriter.md new file mode 100644 index 0000000..e42d230 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/ICmtSchemaWriter.md @@ -0,0 +1,40 @@ + + +# ICmtSchemaWriter + +- Namespace: `PPDS.Migration.Formats` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Interface for writing CMT-compatible schema files. + +## Members + +### Methods + +#### WriteAsync + +`Task WriteAsync(MigrationSchema schema, Stream stream, CancellationToken cancellationToken)` + +Writes a migration schema to a stream. + +- Param `schema`: The schema to write. + +- Param `stream`: The output stream. + +- Param `cancellationToken`: Cancellation token. + +#### WriteAsync + +`Task WriteAsync(MigrationSchema schema, string path, CancellationToken cancellationToken)` + +Writes a migration schema to a file. + +- Param `schema`: The schema to write. + +- Param `path`: The output file path. + +- Param `cancellationToken`: Cancellation token. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Formats/IUserMappingReader.md b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/IUserMappingReader.md new file mode 100644 index 0000000..e13cab2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/IUserMappingReader.md @@ -0,0 +1,28 @@ + + +# IUserMappingReader + +- Namespace: `PPDS.Migration.Formats` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Interface for reading user mappings. + +## Members + +### Methods + +#### ReadAsync + +`Task ReadAsync(Stream stream, CancellationToken cancellationToken)` + +Reads user mappings from a stream. + +#### ReadAsync + +`Task ReadAsync(string path, CancellationToken cancellationToken)` + +Reads user mappings from a file. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Formats/UserMappingReader.md b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/UserMappingReader.md new file mode 100644 index 0000000..57f9cee --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Formats/UserMappingReader.md @@ -0,0 +1,46 @@ + + +# UserMappingReader + +- Namespace: `PPDS.Migration.Formats` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IUserMappingReader` + +## Summary + +Reads user mapping files. + +## Members + +### Constructors + +#### UserMappingReader() + +`UserMappingReader()` + +Initializes a new instance of the `PPDS.Migration.Formats.UserMappingReader` class. + +#### UserMappingReader(ILogger logger) + +`UserMappingReader(ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Formats.UserMappingReader` class. + +- Param `logger`: The logger. + + +### Methods + +#### ReadAsync + +`Task ReadAsync(Stream stream, CancellationToken cancellationToken)` + +Reads user mappings from a stream. + +#### ReadAsync + +`Task ReadAsync(string path, CancellationToken cancellationToken)` + +Reads user mappings from a file. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/BulkOperationProber.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/BulkOperationProber.md new file mode 100644 index 0000000..493e974 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/BulkOperationProber.md @@ -0,0 +1,96 @@ + + +# BulkOperationProber + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Probes entities to detect bulk operation support and executes appropriate strategy. + +## Members + +### Constructors + +#### BulkOperationProber(IBulkOperationExecutor bulkExecutor, ILogger logger) + +`BulkOperationProber(IBulkOperationExecutor bulkExecutor, ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Import.BulkOperationProber` class. + +- Param `bulkExecutor`: The bulk operation executor. + +- Param `logger`: Optional logger. + + +### Methods + +#### ExecuteWithProbeAsync + +`Task ExecuteWithProbeAsync(string entityName, IReadOnlyList records, BulkOperationType operationType, BulkOperationOptions options, DataverseClientOptions clientOptions, Func, Task> fallbackExecutor, IProgress progress, CancellationToken cancellationToken)` + +Executes a bulk operation with probing to detect bulk support. + +- Param `entityName`: The entity logical name. + +- Param `records`: The records to process. + +- Param `operationType`: The type of bulk operation. + +- Param `options`: Bulk operation options. + +- Param `clientOptions`: Optional per-request connection options (e.g., CallerId for impersonation). + +- Param `fallbackExecutor`: Executor for individual operations when bulk isn't supported. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The combined result from probe and remaining records. + +#### IsBulkNotSupportedFailure + +`bool IsBulkNotSupportedFailure(BulkOperationResult result, int totalRecords)` + +Determines if a bulk operation failure indicates the entity doesn't support bulk operations. + +- Param `result`: The bulk operation result. + +- Param `totalRecords`: The total number of records attempted. + +- Returns: True if the failure indicates bulk operations are not supported. + +#### IsKnownBulkNotSupported + +`bool IsKnownBulkNotSupported(string entityName)` + +Gets whether an entity is known to not support bulk operations. + +- Param `entityName`: The entity logical name. + +- Returns: True if the entity is known to not support bulk operations. + +#### MarkBulkNotSupported + +`void MarkBulkNotSupported(string entityName)` + +Marks an entity as not supporting bulk operations. + +- Param `entityName`: The entity logical name. + +#### MergeBulkResults + +`BulkOperationResult MergeBulkResults(BulkOperationResult probeResult, BulkOperationResult remainingResult)` + +Merges two bulk operation results into one combined result. +Used when probe record is processed separately from remaining records. + +- Param `probeResult`: The result from the probe operation (first record). + +- Param `remainingResult`: The result from processing remaining records. + +- Returns: A combined result with adjusted error indices. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/BulkOperationType.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/BulkOperationType.md new file mode 100644 index 0000000..489447e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/BulkOperationType.md @@ -0,0 +1,35 @@ + + +# BulkOperationType + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +The type of bulk operation to execute. + +## Members + +### Fields + +#### Create + +`BulkOperationType Create` + +Create new records. + +#### Update + +`BulkOperationType Update` + +Update existing records. + +#### Upsert + +`BulkOperationType Upsert` + +Create or update records as needed. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/DateShifter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/DateShifter.md new file mode 100644 index 0000000..9fecd55 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/DateShifter.md @@ -0,0 +1,30 @@ + + +# DateShifter + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Shifts date/time values based on the configured `PPDS.Migration.Models.DateMode`. + +## Members + +### Methods + +#### Shift + +`Nullable Shift(Nullable value, DateMode mode, TimeSpan elapsed)` + +Shifts a date/time value based on the specified mode and elapsed time. + +- Param `value`: The original date/time value, or null. + +- Param `mode`: The date shifting mode. + +- Param `elapsed`: The elapsed time since the original export. + +- Returns: The shifted date/time value, or null if `value` is null. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/DeferredFieldProcessor.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/DeferredFieldProcessor.md new file mode 100644 index 0000000..a7d9459 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/DeferredFieldProcessor.md @@ -0,0 +1,55 @@ + + +# DeferredFieldProcessor + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IImportPhaseProcessor` + +## Summary + +Processes deferred fields after the initial entity import. +Deferred fields are self-referential lookups that couldn't be set during initial import +because the target records didn't exist yet. + +## Members + +### Constructors + +#### DeferredFieldProcessor(IDataverseConnectionPool connectionPool, BulkOperationProber prober, ILogger logger) + +`DeferredFieldProcessor(IDataverseConnectionPool connectionPool, BulkOperationProber prober, ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Import.DeferredFieldProcessor` class. + +- Param `connectionPool`: The connection pool. + +- Param `prober`: The bulk operation prober. + +- Param `logger`: Optional logger. + + +### Methods + +#### ProcessAsync + +`Task ProcessAsync(ImportContext context, CancellationToken cancellationToken)` + +Executes this phase of the import. + +- Param `context`: The shared import context containing data, options, and state. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The result of this phase. + + +### Properties + +#### PhaseName + +`string PhaseName { get; }` + +Gets the name of this phase for logging and progress reporting. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/EntityImportResult.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/EntityImportResult.md new file mode 100644 index 0000000..68dfb8d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/EntityImportResult.md @@ -0,0 +1,76 @@ + + +# EntityImportResult + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Result for a single entity import. + +## Members + +### Properties + +#### CreatedCount + +`Nullable CreatedCount { get; set; }` + +Gets or sets the number of records created (for upsert operations). + +#### Duration + +`TimeSpan Duration { get; set; }` + +Gets or sets the import duration for this entity. + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the entity logical name. + +#### Errors + +`IReadOnlyList Errors { get; set; }` + +Gets or sets the errors that occurred during import. + +#### FailureCount + +`int FailureCount { get; set; }` + +Gets or sets the number of failed imports. + +#### RecordCount + +`int RecordCount { get; set; }` + +Gets or sets the number of records imported. + +#### Success + +`bool Success { get; set; }` + +Gets or sets whether this entity import was successful. + +#### SuccessCount + +`int SuccessCount { get; set; }` + +Gets or sets the number of successful imports. + +#### TierNumber + +`int TierNumber { get; set; }` + +Gets or sets the tier this entity was imported in. + +#### UpdatedCount + +`Nullable UpdatedCount { get; set; }` + +Gets or sets the number of records updated (for upsert operations). + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/EntityReferenceMapper.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/EntityReferenceMapper.md new file mode 100644 index 0000000..3c692ec --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/EntityReferenceMapper.md @@ -0,0 +1,74 @@ + + +# EntityReferenceMapper + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Resolves entity references using cascading lookup resolution. + +## Members + +### Constructors + +#### EntityReferenceMapper(IdMappingCollection idMappings, IDataverseConnectionPool pool, ImportOptions options, ILogger logger) + +`EntityReferenceMapper(IdMappingCollection idMappings, IDataverseConnectionPool pool, ImportOptions options, ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Import.EntityReferenceMapper` class. + +- Param `idMappings`: The ID mapping collection. + +- Param `pool`: The connection pool. + +- Param `options`: The import options. + +- Param `logger`: Optional logger. + + +### Methods + +#### GetMatchField + +`string GetMatchField(string entityName)` + +Gets the match field for name-based resolution. + +- Param `entityName`: The entity logical name. + +- Returns: The match field name, or null if no match field is known. + Full implementation would require entity metadata lookup for primary name attribute. + +#### ResolveAsync + +`Task> ResolveAsync(string targetEntityName, Guid sourceId, CancellationToken cancellationToken)` + +Resolves a source entity reference to its target GUID. + +- Param `targetEntityName`: The target entity logical name. + +- Param `sourceId`: The source record GUID. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The resolved target GUID, or null if unresolved. + +#### ResolveWithNameAsync + +`Task> ResolveWithNameAsync(string targetEntityName, Guid sourceId, string nameValue, CancellationToken cancellationToken)` + +Resolves a lookup with name-based fallback. + +- Param `targetEntityName`: The target entity logical name. + +- Param `sourceId`: The source record GUID. + +- Param `nameValue`: The name value for name-based resolution. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The resolved target GUID, or null if unresolved. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/FieldMetadataCollection.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/FieldMetadataCollection.md new file mode 100644 index 0000000..6c6f86c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/FieldMetadataCollection.md @@ -0,0 +1,77 @@ + + +# FieldMetadataCollection + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Collection of field metadata for multiple entities. +Provides lookup methods for field validity during import. + +## Members + +### Constructors + +#### FieldMetadataCollection(IReadOnlyDictionary> metadata) + +`FieldMetadataCollection(IReadOnlyDictionary> metadata)` + +Initializes a new instance of the `PPDS.Migration.Import.FieldMetadataCollection` class. + +- Param `metadata`: The metadata dictionary indexed by entity name. + + +### Methods + +#### GetFieldsForEntity + +`IReadOnlyDictionary GetFieldsForEntity(string entityName)` + +Gets field metadata for a specific entity. + +- Param `entityName`: The entity logical name. + +- Returns: Dictionary of field name to validity, or empty dictionary if entity not found. + +#### HasEntity + +`bool HasEntity(string entityName)` + +Checks if metadata exists for an entity. + +- Param `entityName`: The entity logical name. + +- Returns: True if metadata exists for the entity. + +#### TryGetFieldValidity + +`bool TryGetFieldValidity(string entityName, string fieldName, FieldValidity validity)` + +Tries to get field validity for a specific field. + +- Param `entityName`: The entity logical name. + +- Param `fieldName`: The field logical name. + +- Param `validity`: The field validity if found. + +- Returns: True if the field was found, false otherwise. + + +### Properties + +#### EntityCount + +`int EntityCount { get; }` + +Gets the number of entities with metadata. + +#### EntityNames + +`IEnumerable EntityNames { get; }` + +Gets all entity names with metadata. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/FieldValidity.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/FieldValidity.md new file mode 100644 index 0000000..9472af5 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/FieldValidity.md @@ -0,0 +1,42 @@ + + +# FieldValidity + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Struct +- Implements: `IEquatable` + +## Summary + +Represents the create/update validity of a field in the target environment. + +## Members + +### Constructors + +#### FieldValidity(bool IsValidForCreate, bool IsValidForUpdate) + +`FieldValidity(bool IsValidForCreate, bool IsValidForUpdate)` + +Represents the create/update validity of a field in the target environment. + +- Param `IsValidForCreate`: Whether the field can be set during create operations. + +- Param `IsValidForUpdate`: Whether the field can be set during update operations. + + +### Properties + +#### IsValidForCreate + +`bool IsValidForCreate { get; set; }` + +Whether the field can be set during create operations. + +#### IsValidForUpdate + +`bool IsValidForUpdate { get; set; }` + +Whether the field can be set during update operations. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/FileColumnProcessor.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/FileColumnProcessor.md new file mode 100644 index 0000000..23f5aaf --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/FileColumnProcessor.md @@ -0,0 +1,61 @@ + + +# FileColumnProcessor + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IImportPhaseProcessor` + +## Summary + +Processes file column data after record import. +Uploads binary file data to Dataverse via chunked transfer (4MB blocks). +This runs as Phase 4.5, after M2M relationships and before state transitions are finalized. + +## Members + +### Constructors + +#### FileColumnProcessor(FileColumnTransferHelper transferHelper) + +`FileColumnProcessor(FileColumnTransferHelper transferHelper)` + +Initializes a new instance of the `PPDS.Migration.Import.FileColumnProcessor` class. + +- Param `transferHelper`: The file column transfer helper for chunked uploads. + +#### FileColumnProcessor(FileColumnTransferHelper transferHelper, ILogger logger) + +`FileColumnProcessor(FileColumnTransferHelper transferHelper, ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Import.FileColumnProcessor` class. + +- Param `transferHelper`: The file column transfer helper for chunked uploads. + +- Param `logger`: The logger. + + +### Methods + +#### ProcessAsync + +`Task ProcessAsync(ImportContext context, CancellationToken cancellationToken)` + +Executes this phase of the import. + +- Param `context`: The shared import context containing data, options, and state. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The result of this phase. + + +### Properties + +#### PhaseName + +`string PhaseName { get; }` + +Gets the name of this phase for logging and progress reporting. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/FileColumnTransferHelper.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/FileColumnTransferHelper.md new file mode 100644 index 0000000..2a336cf --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/FileColumnTransferHelper.md @@ -0,0 +1,65 @@ + + +# FileColumnTransferHelper + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Handles chunked upload/download of file column binary data. +Uses 4MB (4,194,304 byte) chunks per Dataverse SDK limit. + +## Members + +### Constructors + +#### FileColumnTransferHelper(IDataverseConnectionPool connectionPool) + +`FileColumnTransferHelper(IDataverseConnectionPool connectionPool)` + +Initializes a new instance of the `PPDS.Migration.Import.FileColumnTransferHelper` class. + +- Param `connectionPool`: The connection pool. + + +### Methods + +#### DownloadAsync + +`Task DownloadAsync(string entityName, Guid recordId, string fieldName, CancellationToken cancellationToken)` + +Downloads file column data in chunks. + +- Param `entityName`: The logical name of the entity. + +- Param `recordId`: The record identifier. + +- Param `fieldName`: The file column attribute name. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The complete file data as a byte array. + +#### UploadAsync + +`Task UploadAsync(string entityName, Guid recordId, string fieldName, byte[] data, string fileName, string mimeType, CancellationToken cancellationToken)` + +Uploads file column data in 4MB chunks. AC-35. +Uses InitializeFileBlocksUploadRequest -> UploadBlockRequest -> CommitFileBlocksUploadRequest. + +- Param `entityName`: The logical name of the entity. + +- Param `recordId`: The record identifier. + +- Param `fieldName`: The file column attribute name. + +- Param `data`: The file data to upload. + +- Param `fileName`: The original file name. + +- Param `mimeType`: The MIME type of the file. + +- Param `cancellationToken`: Cancellation token. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/ActivityPointerHandler.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/ActivityPointerHandler.md new file mode 100644 index 0000000..8fdb8d1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/ActivityPointerHandler.md @@ -0,0 +1,40 @@ + + +# ActivityPointerHandler + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IRecordFilter` + +## Summary + +Filters activitypointer base type records — always skipped because +concrete activity types (email, task, etc.) are imported directly. + +## Members + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this filter applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this filter handles the entity. + +#### ShouldSkip + +`bool ShouldSkip(Entity record, ImportContext context)` + +Determines whether the given record should be skipped during import. + +- Param `record`: The record to evaluate. + +- Param `context`: The import context. + +- Returns: True if the record should be skipped. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/BusinessUnitHandler.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/BusinessUnitHandler.md new file mode 100644 index 0000000..65c5a18 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/BusinessUnitHandler.md @@ -0,0 +1,40 @@ + + +# BusinessUnitHandler + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IRecordTransformer` + +## Summary + +Transforms business unit records during import. +Remaps the root business unit to the target environment's root BU. + +## Members + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this transformer applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this transformer handles the entity. + +#### Transform + +`Entity Transform(Entity record, ImportContext context)` + +Transforms a record before import. + +- Param `record`: The record to transform. + +- Param `context`: The import context. + +- Returns: The transformed record. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/DuplicateRuleHandler.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/DuplicateRuleHandler.md new file mode 100644 index 0000000..4277375 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/DuplicateRuleHandler.md @@ -0,0 +1,67 @@ + + +# DuplicateRuleHandler + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IPostImportHandler`, `IRecordTransformer` + +## Summary + +Handles duplicate rule records during import. +Remaps Entity Type Codes during transform and publishes rules after import. + +## Members + +### Constructors + +#### DuplicateRuleHandler(IDataverseConnectionPool connectionPool, ILogger logger) + +`DuplicateRuleHandler(IDataverseConnectionPool connectionPool, ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Import.Handlers.DuplicateRuleHandler` class. + +- Param `connectionPool`: The Dataverse connection pool. + +- Param `logger`: Optional logger. + + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this transformer applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this transformer handles the entity. + +#### ExecuteAsync + +`Task ExecuteAsync(string entityLogicalName, ImportContext context, CancellationToken cancellationToken)` + +Executes post-import processing for the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Param `context`: The import context. + +- Param `cancellationToken`: The cancellation token. + +- Returns: A task representing the asynchronous operation. + +#### Transform + +`Entity Transform(Entity record, ImportContext context)` + +Transforms a record before import. + +- Param `record`: The record to transform. + +- Param `context`: The import context. + +- Returns: The transformed record. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IPostImportHandler.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IPostImportHandler.md new file mode 100644 index 0000000..ae3caf1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IPostImportHandler.md @@ -0,0 +1,40 @@ + + +# IPostImportHandler + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Executes post-import processing for an entity. + +## Members + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this handler applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this handler handles the entity. + +#### ExecuteAsync + +`Task ExecuteAsync(string entityLogicalName, ImportContext context, CancellationToken cancellationToken)` + +Executes post-import processing for the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Param `context`: The import context. + +- Param `cancellationToken`: The cancellation token. + +- Returns: A task representing the asynchronous operation. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IRecordFilter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IRecordFilter.md new file mode 100644 index 0000000..32b8465 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IRecordFilter.md @@ -0,0 +1,38 @@ + + +# IRecordFilter + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Filters records during import, determining which should be skipped. + +## Members + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this filter applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this filter handles the entity. + +#### ShouldSkip + +`bool ShouldSkip(Entity record, ImportContext context)` + +Determines whether the given record should be skipped during import. + +- Param `record`: The record to evaluate. + +- Param `context`: The import context. + +- Returns: True if the record should be skipped. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IRecordTransformer.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IRecordTransformer.md new file mode 100644 index 0000000..c3e6d0c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IRecordTransformer.md @@ -0,0 +1,38 @@ + + +# IRecordTransformer + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Transforms records before they are imported. + +## Members + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this transformer applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this transformer handles the entity. + +#### Transform + +`Entity Transform(Entity record, ImportContext context)` + +Transforms a record before import. + +- Param `record`: The record to transform. + +- Param `context`: The import context. + +- Returns: The transformed record. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IStateTransitionHandler.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IStateTransitionHandler.md new file mode 100644 index 0000000..4d21da5 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IStateTransitionHandler.md @@ -0,0 +1,38 @@ + + +# IStateTransitionHandler + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Determines state transitions to apply to records after import. + +## Members + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this handler applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this handler handles the entity. + +#### GetTransition + +`StateTransitionData GetTransition(Entity record, ImportContext context)` + +Gets the state transition data for a record, or null if no transition is needed. + +- Param `record`: The record to evaluate. + +- Param `context`: The import context. + +- Returns: The state transition data, or null. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IncidentHandler.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IncidentHandler.md new file mode 100644 index 0000000..04b5802 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/IncidentHandler.md @@ -0,0 +1,52 @@ + + +# IncidentHandler + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IRecordTransformer`, `IStateTransitionHandler` + +## Summary + +Handles state transitions for incident (case) records. +Both resolved and canceled states use CloseIncident. + +## Members + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this transformer applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this transformer handles the entity. + +#### GetTransition + +`StateTransitionData GetTransition(Entity record, ImportContext context)` + +Gets the state transition data for a record, or null if no transition is needed. + +- Param `record`: The record to evaluate. + +- Param `context`: The import context. + +- Returns: The state transition data, or null. + +#### Transform + +`Entity Transform(Entity record, ImportContext context)` + +Transforms a record before import. + +- Param `record`: The record to transform. + +- Param `context`: The import context. + +- Returns: The transformed record. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/LeadHandler.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/LeadHandler.md new file mode 100644 index 0000000..95bbedb --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/LeadHandler.md @@ -0,0 +1,53 @@ + + +# LeadHandler + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IRecordTransformer`, `IStateTransitionHandler` + +## Summary + +Handles state transitions for lead records. +Qualified leads use QualifyLead with suppressed side-effects; +disqualified leads use SetStateRequest (null SdkMessage). + +## Members + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this transformer applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this transformer handles the entity. + +#### GetTransition + +`StateTransitionData GetTransition(Entity record, ImportContext context)` + +Gets the state transition data for a record, or null if no transition is needed. + +- Param `record`: The record to evaluate. + +- Param `context`: The import context. + +- Returns: The state transition data, or null. + +#### Transform + +`Entity Transform(Entity record, ImportContext context)` + +Transforms a record before import. + +- Param `record`: The record to transform. + +- Param `context`: The import context. + +- Returns: The transformed record. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/OpportunityHandler.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/OpportunityHandler.md new file mode 100644 index 0000000..814ee1d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/OpportunityHandler.md @@ -0,0 +1,52 @@ + + +# OpportunityHandler + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IRecordTransformer`, `IStateTransitionHandler` + +## Summary + +Handles state transitions for opportunity records. +Won opportunities use WinOpportunity; lost use LoseOpportunity. + +## Members + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this transformer applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this transformer handles the entity. + +#### GetTransition + +`StateTransitionData GetTransition(Entity record, ImportContext context)` + +Gets the state transition data for a record, or null if no transition is needed. + +- Param `record`: The record to evaluate. + +- Param `context`: The import context. + +- Returns: The state transition data, or null. + +#### Transform + +`Entity Transform(Entity record, ImportContext context)` + +Transforms a record before import. + +- Param `record`: The record to transform. + +- Param `context`: The import context. + +- Returns: The transformed record. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/ProductHandler.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/ProductHandler.md new file mode 100644 index 0000000..510e2ad --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/ProductHandler.md @@ -0,0 +1,62 @@ + + +# ProductHandler + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IRecordFilter`, `IStateTransitionHandler` + +## Summary + +Handles product records during import. +Cascades skip to child products when a parent product fails, +and handles state transitions for non-draft products. + +## Members + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this filter applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this filter handles the entity. + +#### GetTransition + +`StateTransitionData GetTransition(Entity record, ImportContext context)` + +Gets the state transition data for a record, or null if no transition is needed. + +- Param `record`: The record to evaluate. + +- Param `context`: The import context. + +- Returns: The state transition data, or null. + +#### ShouldSkip + +`bool ShouldSkip(Entity record, ImportContext context)` + +Determines whether the given record should be skipped during import. + +- Param `record`: The record to evaluate. + +- Param `context`: The import context. + +- Returns: True if the record should be skipped. + +#### TrackFailure + +`void TrackFailure(Guid productId)` + +Tracks a product record that failed during import. +This enables cascade-skip for child products that reference this parent. + +- Param `productId`: The ID of the failed product. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/QuoteHandler.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/QuoteHandler.md new file mode 100644 index 0000000..f19922a --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/QuoteHandler.md @@ -0,0 +1,52 @@ + + +# QuoteHandler + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IRecordTransformer`, `IStateTransitionHandler` + +## Summary + +Handles state transitions for quote records. +Won quotes use WinQuote; closed quotes use CloseQuote. + +## Members + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this transformer applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this transformer handles the entity. + +#### GetTransition + +`StateTransitionData GetTransition(Entity record, ImportContext context)` + +Gets the state transition data for a record, or null if no transition is needed. + +- Param `record`: The record to evaluate. + +- Param `context`: The import context. + +- Returns: The state transition data, or null. + +#### Transform + +`Entity Transform(Entity record, ImportContext context)` + +Transforms a record before import. + +- Param `record`: The record to transform. + +- Param `context`: The import context. + +- Returns: The transformed record. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/SalesOrderHandler.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/SalesOrderHandler.md new file mode 100644 index 0000000..edb4f74 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/SalesOrderHandler.md @@ -0,0 +1,52 @@ + + +# SalesOrderHandler + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IRecordTransformer`, `IStateTransitionHandler` + +## Summary + +Handles state transitions for sales order records. +Fulfilled orders use FulfillSalesOrder; canceled orders use CancelSalesOrder. + +## Members + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this transformer applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this transformer handles the entity. + +#### GetTransition + +`StateTransitionData GetTransition(Entity record, ImportContext context)` + +Gets the state transition data for a record, or null if no transition is needed. + +- Param `record`: The record to evaluate. + +- Param `context`: The import context. + +- Returns: The state transition data, or null. + +#### Transform + +`Entity Transform(Entity record, ImportContext context)` + +Transforms a record before import. + +- Param `record`: The record to transform. + +- Param `context`: The import context. + +- Returns: The transformed record. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/SystemUserHandler.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/SystemUserHandler.md new file mode 100644 index 0000000..90e81ec --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/Handlers/SystemUserHandler.md @@ -0,0 +1,39 @@ + + +# SystemUserHandler + +- Namespace: `PPDS.Migration.Import.Handlers` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IRecordFilter` + +## Summary + +Filters system, integration, and support users during import. + +## Members + +### Methods + +#### CanHandle + +`bool CanHandle(string entityLogicalName)` + +Determines whether this filter applies to the given entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: True if this filter handles the entity. + +#### ShouldSkip + +`bool ShouldSkip(Entity record, ImportContext context)` + +Determines whether the given record should be skipped during import. + +- Param `record`: The record to evaluate. + +- Param `context`: The import context. + +- Returns: True if the record should be skipped. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/IImportPhaseProcessor.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/IImportPhaseProcessor.md new file mode 100644 index 0000000..0620407 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/IImportPhaseProcessor.md @@ -0,0 +1,38 @@ + + +# IImportPhaseProcessor + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Processes a phase of the import pipeline. +Each phase operates on the shared `PPDS.Migration.Import.ImportContext` and returns a `PPDS.Migration.Import.PhaseResult`. + +## Members + +### Methods + +#### ProcessAsync + +`Task ProcessAsync(ImportContext context, CancellationToken cancellationToken)` + +Executes this phase of the import. + +- Param `context`: The shared import context containing data, options, and state. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The result of this phase. + + +### Properties + +#### PhaseName + +`string PhaseName { get; }` + +Gets the name of this phase for logging and progress reporting. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/IImporter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/IImporter.md new file mode 100644 index 0000000..ba277d3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/IImporter.md @@ -0,0 +1,50 @@ + + +# IImporter + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Interface for importing data to Dataverse. + +## Members + +### Methods + +#### ImportAsync + +`Task ImportAsync(MigrationData data, ExecutionPlan plan, ImportOptions options, IProgressReporter progress, CancellationToken cancellationToken)` + +Imports data using a pre-built execution plan. + +- Param `data`: The migration data. + +- Param `plan`: The execution plan. + +- Param `options`: Import options. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The import result. + +#### ImportAsync + +`Task ImportAsync(string dataPath, ImportOptions options, IProgressReporter progress, CancellationToken cancellationToken)` + +Imports data from a CMT-format ZIP file. + +- Param `dataPath`: Path to the data.zip file. + +- Param `options`: Import options. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The import result. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/IPluginStepManager.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/IPluginStepManager.md new file mode 100644 index 0000000..be425e3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/IPluginStepManager.md @@ -0,0 +1,38 @@ + + +# IPluginStepManager + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Interface for managing plugin steps during import. + +## Members + +### Methods + +#### DisablePluginStepsAsync + +`Task DisablePluginStepsAsync(IEnumerable stepIds, CancellationToken cancellationToken)` + +Disables the specified plugin steps. + +#### EnablePluginStepsAsync + +`Task EnablePluginStepsAsync(IEnumerable stepIds, CancellationToken cancellationToken)` + +Re-enables the specified plugin steps. + +#### GetActivePluginStepsAsync + +`Task> GetActivePluginStepsAsync(IEnumerable objectTypeCodes, CancellationToken cancellationToken)` + +Gets the IDs of active plugin steps for the specified entities. + +- Param `objectTypeCodes`: The Object Type Codes of entities to find plugin steps for. + +- Param `cancellationToken`: Cancellation token. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/ISchemaValidator.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/ISchemaValidator.md new file mode 100644 index 0000000..a06d664 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/ISchemaValidator.md @@ -0,0 +1,58 @@ + + +# ISchemaValidator + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Validates schema compatibility between exported data and target environment. + +## Members + +### Methods + +#### DetectMissingColumns + +`SchemaMismatchResult DetectMissingColumns(MigrationData data, FieldMetadataCollection targetFieldMetadata)` + +Detects columns in exported data that don't exist in target environment. + +- Param `data`: The migration data containing exported records. + +- Param `targetFieldMetadata`: The target environment field metadata. + +- Returns: Result containing missing columns by entity. + +#### LoadTargetFieldMetadataAsync + +`Task LoadTargetFieldMetadataAsync(IEnumerable entityNames, IProgressReporter progress, CancellationToken cancellationToken)` + +Loads field validity metadata from the target environment for all entities. + +- Param `entityNames`: The entity names to load metadata for. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Collection of field metadata indexed by entity name. + +#### ShouldIncludeField + +`bool ShouldIncludeField(string fieldName, ImportMode mode, IReadOnlyDictionary fieldMetadata, string reason)` + +Determines if a field should be included in the import based on operation mode and metadata. + +- Param `fieldName`: The field name to check. + +- Param `mode`: The import mode. + +- Param `fieldMetadata`: Target environment field metadata for the entity. + +- Param `reason`: Output: reason field was excluded, if any. + +- Returns: True if field should be included, false otherwise. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/ImportContext.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/ImportContext.md new file mode 100644 index 0000000..80bc128 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/ImportContext.md @@ -0,0 +1,123 @@ + + +# ImportContext + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Shared context passed to all import phases. +Contains the data, plan, options, and shared state needed for import operations. + +## Members + +### Constructors + +#### ImportContext(MigrationData data, ExecutionPlan plan, ImportOptions options, IdMappingCollection idMappings, FieldMetadataCollection targetFieldMetadata, IProgressReporter progress) + +`ImportContext(MigrationData data, ExecutionPlan plan, ImportOptions options, IdMappingCollection idMappings, FieldMetadataCollection targetFieldMetadata, IProgressReporter progress)` + +Initializes a new instance of the `PPDS.Migration.Import.ImportContext` class. + +- Param `data`: The migration data containing records to import. + +- Param `plan`: The execution plan defining tier order and deferred fields. + +- Param `options`: The import options. + +- Param `idMappings`: The shared ID mapping collection. + +- Param `targetFieldMetadata`: The target environment field metadata. + +- Param `progress`: Optional progress reporter. + + +### Properties + +#### Data + +`MigrationData Data { get; }` + +Gets the migration data containing records to import. + +#### IdMappings + +`IdMappingCollection IdMappings { get; }` + +Gets the shared ID mapping collection. +This is populated during entity import and read during deferred field and relationship processing. +Thread-safe for concurrent access. + +#### Options + +`ImportOptions Options { get; }` + +Gets the import options. + +#### OutputManager + +`ImportOutputManager OutputManager { get; set; }` + +Gets or sets the optional output manager for checkpoint logging. +When set, tier starts, entity completions, and phase transitions are logged to the progress file. + +#### Plan + +`ExecutionPlan Plan { get; }` + +Gets the execution plan defining tier order and deferred fields. + +#### Progress + +`IProgressReporter Progress { get; }` + +Gets the progress reporter (never null; defaults to `PPDS.Migration.Progress.IProgressReporter.Silent`). + +#### SourceEntityTypeCodes + +`Dictionary SourceEntityTypeCodes { get; set; }` + +Gets or sets the source Entity Type Code to logical name mapping. +Used by DuplicateRuleHandler to remap baseentitytypecode and matchingentitytypecode fields. +Key is the source ETC (int), value is the entity logical name. + +#### StateTransitions + +`StateTransitionCollection StateTransitions { get; }` + +Gets the collection of state transitions to apply after record import. +Thread-safe for concurrent access during parallel import. + +#### TargetEntityTypeCodes + +`Dictionary TargetEntityTypeCodes { get; set; }` + +Gets or sets the target logical name to Entity Type Code mapping. +Used by DuplicateRuleHandler to remap baseentitytypecode and matchingentitytypecode fields. +Key is the entity logical name, value is the target ETC (int). + +#### TargetFieldMetadata + +`FieldMetadataCollection TargetFieldMetadata { get; }` + +Gets the target environment field metadata. +Used to validate which fields are valid for create/update operations. + +#### TargetRootBusinessUnitId + +`Nullable TargetRootBusinessUnitId { get; set; }` + +Gets or sets the target environment's root business unit ID. +Used by BusinessUnitHandler to remap the root BU during import. + +#### Warnings + +`IWarningCollector Warnings { get; set; }` + +Gets or sets the warning collector shared across the import pipeline. +Phase processors write non-fatal warnings here (e.g., skipped role mappings) +so `PPDS.Migration.Import.TieredImporter` can surface them in the final result. +Defaults to a local `PPDS.Migration.Progress.WarningCollector` so phase tests do not need to wire it. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/ImportMode.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/ImportMode.md new file mode 100644 index 0000000..0654e21 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/ImportMode.md @@ -0,0 +1,41 @@ + + +# ImportMode + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Import mode for handling records. + +## Members + +### Fields + +#### Create + +`ImportMode Create` + +Create new records only. Fails if record exists. + +#### Skip + +`ImportMode Skip` + +Skip this entity entirely during import. + +#### Update + +`ImportMode Update` + +Update existing records only. Fails if record doesn't exist. + +#### Upsert + +`ImportMode Upsert` + +Create or update records as needed. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/ImportOptions.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/ImportOptions.md new file mode 100644 index 0000000..cda00d0 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/ImportOptions.md @@ -0,0 +1,138 @@ + + +# ImportOptions + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Options for import operations. + +## Members + +### Properties + +#### BypassCustomPlugins + +`CustomLogicBypass BypassCustomPlugins { get; set; }` + +Gets or sets which custom business logic to bypass during import. + +#### BypassPowerAutomateFlows + +`bool BypassPowerAutomateFlows { get; set; }` + +Gets or sets whether to bypass Power Automate flows. +Default: false + +#### ContinueOnError + +`bool ContinueOnError { get; set; }` + +Gets or sets whether to continue on individual record failures. +Default: true + +#### CurrentUserId + +`Nullable CurrentUserId { get; set; }` + +Gets or sets the current user's ID for fallback when user mappings can't resolve a reference. + +#### ErrorCallback + +`Action ErrorCallback { get; set; }` + +Gets or sets the callback for streaming errors as they occur. + +#### ImpersonateOwners + +`bool ImpersonateOwners { get; set; }` + +Gets or sets whether to impersonate record owners during import. +When true, records are created/updated as the original owner using caller-object-id impersonation. +Default: false + +#### MaxParallelEntities + +`int MaxParallelEntities { get; set; }` + +Gets or sets the maximum parallel entities within a tier. +Must be at least 1. +Default: 4 + +#### Mode + +`ImportMode Mode { get; set; }` + +Gets or sets the import mode. +Default: Upsert + +#### OutputManager + +`ImportOutputManager OutputManager { get; set; }` + +Gets or sets the output manager for checkpoint logging during import. + +#### ResolveExternalLookups + +`bool ResolveExternalLookups { get; set; }` + +Gets or sets whether to resolve lookups to entities not in the migration schema +by querying the target environment. +Default: false + +#### RespectDisablePluginsSetting + +`bool RespectDisablePluginsSetting { get; set; }` + +Gets or sets whether to disable plugins on entities marked with disableplugins=true in schema. +Default: true (respects schema setting) + +#### SkipMissingColumns + +`bool SkipMissingColumns { get; set; }` + +Gets or sets whether to skip columns that exist in exported data but not in the target environment. + +#### SkipUnresolvedLookups + +`bool SkipUnresolvedLookups { get; set; }` + +Gets or sets whether to skip (null out) lookup references that cannot be resolved. +When false, unresolved lookups cause an error. +Default: true + +#### StripOwnerFields + +`bool StripOwnerFields { get; set; }` + +Gets or sets whether to strip owner-related fields during import. +When true, removes ownerid, createdby, modifiedby, and related fields, +allowing Dataverse to assign the current user as owner. +Use this when importing data to a different environment where source +users don't exist. +Default: false + +#### SuppressDuplicateDetection + +`bool SuppressDuplicateDetection { get; set; }` + +Gets or sets whether to suppress duplicate detection. +Default: false + +#### UseBulkApis + +`bool UseBulkApis { get; set; }` + +Gets or sets whether to use modern bulk APIs (CreateMultiple, etc.). +Default: true + +#### UserMappings + +`UserMappingCollection UserMappings { get; set; }` + +Gets or sets the user mappings for remapping user references. +If null, user references are not remapped. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/ImportResult.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/ImportResult.md new file mode 100644 index 0000000..c334076 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/ImportResult.md @@ -0,0 +1,112 @@ + + +# ImportResult + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Result of an import operation. + +## Members + +### Properties + +#### Duration + +`TimeSpan Duration { get; set; }` + +Gets or sets the import duration. + +#### EntityResults + +`IReadOnlyList EntityResults { get; set; }` + +Gets or sets the results per entity. + +#### Errors + +`IReadOnlyList Errors { get; set; }` + +Gets or sets the errors that occurred. + +#### Phase1Duration + +`TimeSpan Phase1Duration { get; set; }` + +Gets or sets the duration of Phase 1 (entity import). + +#### Phase2Duration + +`TimeSpan Phase2Duration { get; set; }` + +Gets or sets the duration of Phase 2 (deferred fields). + +#### Phase3Duration + +`TimeSpan Phase3Duration { get; set; }` + +Gets or sets the duration of Phase 3 (M2M relationships). + +#### PoolStatistics + +`PoolStatistics PoolStatistics { get; set; }` + +Gets or sets the connection pool statistics at the end of the import. + +#### RecordsImported + +`int RecordsImported { get; set; }` + +Gets or sets the number of records imported. + +#### RecordsPerSecond + +`double RecordsPerSecond { get; }` + +Gets the average records per second. + +#### RecordsUpdated + +`int RecordsUpdated { get; set; }` + +Gets or sets the number of records updated (deferred fields). + +#### RelationshipsFailed + +`int RelationshipsFailed { get; set; }` + +Gets or sets the number of relationship failures. + +#### RelationshipsProcessed + +`int RelationshipsProcessed { get; set; }` + +Gets or sets the number of relationships processed. + +#### SourceRecordCount + +`int SourceRecordCount { get; set; }` + +Gets or sets the number of records in the source data file. + +#### Success + +`bool Success { get; set; }` + +Gets or sets whether the import was successful. + +#### TiersProcessed + +`int TiersProcessed { get; set; }` + +Gets or sets the number of tiers processed. + +#### Warnings + +`IReadOnlyList Warnings { get; set; }` + +Gets or sets the warnings that occurred during import. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/PhaseResult.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/PhaseResult.md new file mode 100644 index 0000000..51b9920 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/PhaseResult.md @@ -0,0 +1,71 @@ + + +# PhaseResult + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Result from a single import phase. + +## Members + +### Methods + +#### Skipped + +`PhaseResult Skipped()` + +Creates a successful result with no records processed (phase skipped). + +#### Succeeded + +`PhaseResult Succeeded(int processed, TimeSpan duration)` + +Creates a successful result with the specified counts. + +- Param `processed`: Number of records processed. + +- Param `duration`: Duration of the phase. + + +### Properties + +#### Duration + +`TimeSpan Duration { get; set; }` + +Gets or sets the duration of this phase. + +#### Errors + +`IReadOnlyList Errors { get; set; }` + +Gets or sets the errors encountered during this phase. + +#### FailureCount + +`int FailureCount { get; set; }` + +Gets or sets the number of failed records. + +#### RecordsProcessed + +`int RecordsProcessed { get; set; }` + +Gets or sets the total number of records processed in this phase. + +#### Success + +`bool Success { get; set; }` + +Gets or sets whether the phase completed successfully (no errors). + +#### SuccessCount + +`int SuccessCount { get; set; }` + +Gets or sets the number of successfully processed records. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/PluginStepManager.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/PluginStepManager.md new file mode 100644 index 0000000..96edb27 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/PluginStepManager.md @@ -0,0 +1,54 @@ + + +# PluginStepManager + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IPluginStepManager` + +## Summary + +Manages plugin step disabling/enabling during import. + +## Members + +### Constructors + +#### PluginStepManager(IDataverseConnectionPool connectionPool) + +`PluginStepManager(IDataverseConnectionPool connectionPool)` + +Initializes a new instance of the `PPDS.Migration.Import.PluginStepManager` class. + +#### PluginStepManager(IDataverseConnectionPool connectionPool, ILogger logger) + +`PluginStepManager(IDataverseConnectionPool connectionPool, ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Import.PluginStepManager` class. + + +### Methods + +#### DisablePluginStepsAsync + +`Task DisablePluginStepsAsync(IEnumerable stepIds, CancellationToken cancellationToken)` + +Disables the specified plugin steps. + +#### EnablePluginStepsAsync + +`Task EnablePluginStepsAsync(IEnumerable stepIds, CancellationToken cancellationToken)` + +Re-enables the specified plugin steps. + +#### GetActivePluginStepsAsync + +`Task> GetActivePluginStepsAsync(IEnumerable objectTypeCodes, CancellationToken cancellationToken)` + +Gets the IDs of active plugin steps for the specified entities. + +- Param `objectTypeCodes`: The Object Type Codes of entities to find plugin steps for. + +- Param `cancellationToken`: Cancellation token. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/PluginStepReenableException.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/PluginStepReenableException.md new file mode 100644 index 0000000..3965a28 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/PluginStepReenableException.md @@ -0,0 +1,36 @@ + + +# PluginStepReenableException + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class +- Base: `Exception` +- Implements: `ISerializable` + +## Summary + +Aggregated exception thrown when one or more plugin steps fail to re-enable. +Preserves per-step failure details so callers can report exactly which steps remain disabled. + +## Members + +### Constructors + +#### PluginStepReenableException(IReadOnlyList> failures) + +`PluginStepReenableException(IReadOnlyList> failures)` + +Initializes a new instance of the `PPDS.Migration.Import.PluginStepReenableException` class. + +- Param `failures`: The per-step failures. + + +### Properties + +#### Failures + +`IReadOnlyList> Failures { get; }` + +Gets the per-step failures. Each tuple contains the step ID and the underlying exception. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/RelationshipProcessor.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/RelationshipProcessor.md new file mode 100644 index 0000000..9606cd0 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/RelationshipProcessor.md @@ -0,0 +1,52 @@ + + +# RelationshipProcessor + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IImportPhaseProcessor` + +## Summary + +Processes many-to-many relationships after entity import. +Creates associations between records using the mapped IDs. + +## Members + +### Constructors + +#### RelationshipProcessor(IDataverseConnectionPool connectionPool, ILogger logger) + +`RelationshipProcessor(IDataverseConnectionPool connectionPool, ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Import.RelationshipProcessor` class. + +- Param `connectionPool`: The connection pool. + +- Param `logger`: Optional logger. + + +### Methods + +#### ProcessAsync + +`Task ProcessAsync(ImportContext context, CancellationToken cancellationToken)` + +Executes this phase of the import. + +- Param `context`: The shared import context containing data, options, and state. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The result of this phase. + + +### Properties + +#### PhaseName + +`string PhaseName { get; }` + +Gets the name of this phase for logging and progress reporting. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/SchemaMismatchException.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/SchemaMismatchException.md new file mode 100644 index 0000000..4a2547d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/SchemaMismatchException.md @@ -0,0 +1,55 @@ + + +# SchemaMismatchException + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class +- Base: `Exception` +- Implements: `ISerializable` + +## Summary + +Exception thrown when exported data contains columns that don't exist in the target environment. + +## Members + +### Constructors + +#### SchemaMismatchException(string message, Dictionary> missingColumns) + +`SchemaMismatchException(string message, Dictionary> missingColumns)` + +Initializes a new instance of the `PPDS.Migration.Import.SchemaMismatchException` class. + +- Param `message`: The error message. + +- Param `missingColumns`: Dictionary of entity name to list of missing column names. + +#### SchemaMismatchException(string message, Dictionary> missingColumns, Exception innerException) + +`SchemaMismatchException(string message, Dictionary> missingColumns, Exception innerException)` + +Initializes a new instance of the `PPDS.Migration.Import.SchemaMismatchException` class. + +- Param `message`: The error message. + +- Param `missingColumns`: Dictionary of entity name to list of missing column names. + +- Param `innerException`: The inner exception. + + +### Properties + +#### MissingColumns + +`IReadOnlyDictionary> MissingColumns { get; }` + +Gets the missing columns by entity name. + +#### TotalMissingCount + +`int TotalMissingCount { get; }` + +Gets the total count of missing columns across all entities. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/SchemaMismatchResult.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/SchemaMismatchResult.md new file mode 100644 index 0000000..1aaa193 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/SchemaMismatchResult.md @@ -0,0 +1,56 @@ + + +# SchemaMismatchResult + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Result of schema mismatch detection between exported data and target environment. + +## Members + +### Constructors + +#### SchemaMismatchResult(IReadOnlyDictionary> missingColumns) + +`SchemaMismatchResult(IReadOnlyDictionary> missingColumns)` + +Initializes a new instance of the `PPDS.Migration.Import.SchemaMismatchResult` class. + +- Param `missingColumns`: Dictionary of entity name to list of missing column names. + + +### Methods + +#### BuildDetailedMessage + +`string BuildDetailedMessage()` + +Builds a detailed error message describing the missing columns. + +- Returns: A formatted error message. + + +### Properties + +#### HasMissingColumns + +`bool HasMissingColumns { get; }` + +Gets whether there are any missing columns. + +#### MissingColumns + +`IReadOnlyDictionary> MissingColumns { get; }` + +Gets the missing columns by entity name. + +#### TotalMissingCount + +`int TotalMissingCount { get; }` + +Gets the total number of missing columns across all entities. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/SchemaValidator.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/SchemaValidator.md new file mode 100644 index 0000000..4453675 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/SchemaValidator.md @@ -0,0 +1,72 @@ + + +# SchemaValidator + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `ISchemaValidator` + +## Summary + +Validates schema compatibility between exported data and target environment. + +## Members + +### Constructors + +#### SchemaValidator(IDataverseConnectionPool connectionPool, ILogger logger) + +`SchemaValidator(IDataverseConnectionPool connectionPool, ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Import.SchemaValidator` class. + +- Param `connectionPool`: The connection pool. + +- Param `logger`: Optional logger. + + +### Methods + +#### DetectMissingColumns + +`SchemaMismatchResult DetectMissingColumns(MigrationData data, FieldMetadataCollection targetFieldMetadata)` + +Detects columns in exported data that don't exist in target environment. + +- Param `data`: The migration data containing exported records. + +- Param `targetFieldMetadata`: The target environment field metadata. + +- Returns: Result containing missing columns by entity. + +#### LoadTargetFieldMetadataAsync + +`Task LoadTargetFieldMetadataAsync(IEnumerable entityNames, IProgressReporter progress, CancellationToken cancellationToken)` + +Loads field validity metadata from the target environment for all entities. + +- Param `entityNames`: The entity names to load metadata for. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: Collection of field metadata indexed by entity name. + +#### ShouldIncludeField + +`bool ShouldIncludeField(string fieldName, ImportMode mode, IReadOnlyDictionary fieldMetadata, string reason)` + +Determines if a field should be included in the import based on operation mode and metadata. + +- Param `fieldName`: The field name to check. + +- Param `mode`: The import mode. + +- Param `fieldMetadata`: Target environment field metadata for the entity. + +- Param `reason`: Output: reason field was excluded, if any. + +- Returns: True if field should be included, false otherwise. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/StateTransitionCollection.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/StateTransitionCollection.md new file mode 100644 index 0000000..40d9f62 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/StateTransitionCollection.md @@ -0,0 +1,53 @@ + + +# StateTransitionCollection + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Thread-safe collection of state transitions to apply after record import. + +## Members + +### Methods + +#### Add + +`void Add(string entityName, Guid recordId, StateTransitionData data)` + +Adds a state transition for a record. + +- Param `entityName`: The entity logical name. + +- Param `recordId`: The record ID. + +- Param `data`: The state transition data. + +#### GetEntityNames + +`IEnumerable GetEntityNames()` + +Gets all entity names that have transitions. + +#### GetTransitions + +`IReadOnlyList GetTransitions(string entityName)` + +Gets all transitions for a given entity. + +- Param `entityName`: The entity logical name. + +- Returns: A read-only list of transitions, or an empty list if none exist. + + +### Properties + +#### Count + +`int Count { get; }` + +Gets the total number of transitions across all entities. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/StateTransitionData.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/StateTransitionData.md new file mode 100644 index 0000000..4f7dd85 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/StateTransitionData.md @@ -0,0 +1,52 @@ + + +# StateTransitionData + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Describes a state/status transition to apply to a record after import. + +## Members + +### Properties + +#### EntityName + +`string EntityName { get; set; }` + +Gets the entity logical name. + +#### MessageData + +`Dictionary MessageData { get; set; }` + +Gets extra parameters for the SDK message. + +#### RecordId + +`Guid RecordId { get; set; }` + +Gets the record ID. + +#### SdkMessage + +`string SdkMessage { get; set; }` + +Gets the SDK message to use for the transition, or null to use SetStateRequest. + +#### StateCode + +`int StateCode { get; set; }` + +Gets the target state code. + +#### StatusCode + +`int StatusCode { get; set; }` + +Gets the target status code. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/StateTransitionProcessor.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/StateTransitionProcessor.md new file mode 100644 index 0000000..f41e893 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/StateTransitionProcessor.md @@ -0,0 +1,52 @@ + + +# StateTransitionProcessor + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IImportPhaseProcessor` + +## Summary + +Processes Phase 3 of the import pipeline: applying state transitions +collected during Phase 1 entity import. + +## Members + +### Constructors + +#### StateTransitionProcessor(IDataverseConnectionPool connectionPool, ILogger logger) + +`StateTransitionProcessor(IDataverseConnectionPool connectionPool, ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Import.StateTransitionProcessor` class. + +- Param `connectionPool`: The connection pool for Dataverse operations. + +- Param `logger`: Optional logger. + + +### Methods + +#### ProcessAsync + +`Task ProcessAsync(ImportContext context, CancellationToken cancellationToken)` + +Executes this phase of the import. + +- Param `context`: The shared import context containing data, options, and state. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The result of this phase. + + +### Properties + +#### PhaseName + +`string PhaseName { get; }` + +Gets the name of this phase for logging and progress reporting. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Import/TieredImporter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Import/TieredImporter.md new file mode 100644 index 0000000..7fcffd3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Import/TieredImporter.md @@ -0,0 +1,67 @@ + + +# TieredImporter + +- Namespace: `PPDS.Migration.Import` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IImporter` + +## Summary + +Tiered importer that respects dependency order. +Orchestrates the import pipeline: entity import, deferred fields, and relationships. + +## Members + +### Constructors + +#### TieredImporter(IDataverseConnectionPool connectionPool, IBulkOperationExecutor bulkExecutor, ICmtDataReader dataReader, IDependencyGraphBuilder graphBuilder, IExecutionPlanBuilder planBuilder, ISchemaValidator schemaValidator, DeferredFieldProcessor deferredFieldProcessor, RelationshipProcessor relationshipProcessor, BulkOperationProber prober) + +`TieredImporter(IDataverseConnectionPool connectionPool, IBulkOperationExecutor bulkExecutor, ICmtDataReader dataReader, IDependencyGraphBuilder graphBuilder, IExecutionPlanBuilder planBuilder, ISchemaValidator schemaValidator, DeferredFieldProcessor deferredFieldProcessor, RelationshipProcessor relationshipProcessor, BulkOperationProber prober)` + +Initializes a new instance of the `PPDS.Migration.Import.TieredImporter` class. + +#### TieredImporter(IDataverseConnectionPool connectionPool, IBulkOperationExecutor bulkExecutor, ICmtDataReader dataReader, IDependencyGraphBuilder graphBuilder, IExecutionPlanBuilder planBuilder, ISchemaValidator schemaValidator, DeferredFieldProcessor deferredFieldProcessor, RelationshipProcessor relationshipProcessor, BulkOperationProber prober, IEnumerable recordFilters, IEnumerable recordTransformers, IEnumerable stateTransitionHandlers, IEnumerable postImportHandlers, StateTransitionProcessor stateTransitionProcessor, FileColumnProcessor fileColumnProcessor, IOptions migrationOptions, IPluginStepManager pluginStepManager, ILogger logger) + +`TieredImporter(IDataverseConnectionPool connectionPool, IBulkOperationExecutor bulkExecutor, ICmtDataReader dataReader, IDependencyGraphBuilder graphBuilder, IExecutionPlanBuilder planBuilder, ISchemaValidator schemaValidator, DeferredFieldProcessor deferredFieldProcessor, RelationshipProcessor relationshipProcessor, BulkOperationProber prober, IEnumerable recordFilters, IEnumerable recordTransformers, IEnumerable stateTransitionHandlers, IEnumerable postImportHandlers, StateTransitionProcessor stateTransitionProcessor, FileColumnProcessor fileColumnProcessor, IOptions migrationOptions, IPluginStepManager pluginStepManager, ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Import.TieredImporter` class. + + +### Methods + +#### ImportAsync + +`Task ImportAsync(MigrationData data, ExecutionPlan plan, ImportOptions options, IProgressReporter progress, CancellationToken cancellationToken)` + +Imports data using a pre-built execution plan. + +- Param `data`: The migration data. + +- Param `plan`: The execution plan. + +- Param `options`: Import options. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The import result. + +#### ImportAsync + +`Task ImportAsync(string dataPath, ImportOptions options, IProgressReporter progress, CancellationToken cancellationToken)` + +Imports data from a CMT-format ZIP file. + +- Param `dataPath`: Path to the data.zip file. + +- Param `options`: Import options. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The import result. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/CircularReference.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/CircularReference.md new file mode 100644 index 0000000..58cb503 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/CircularReference.md @@ -0,0 +1,28 @@ + + +# CircularReference + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Represents a circular reference between entities. + +## Members + +### Properties + +#### Edges + +`IReadOnlyList Edges { get; set; }` + +Gets or sets the edges forming the cycle. + +#### Entities + +`IReadOnlyList Entities { get; set; }` + +Gets or sets the entities involved in the circular reference. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/DateMode.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/DateMode.md new file mode 100644 index 0000000..537a3ca --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/DateMode.md @@ -0,0 +1,41 @@ + + +# DateMode + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Determines how date/time fields are adjusted during import. + +## Members + +### Fields + +#### Absolute + +`DateMode Absolute` + +Import the original date/time value unchanged. + +#### Relative + +`DateMode Relative` + +Shift by whole weeks (round elapsed to nearest 7-day period). + +#### RelativeDaily + +`DateMode RelativeDaily` + +Shift by whole days (round elapsed to nearest day). + +#### RelativeExact + +`DateMode RelativeExact` + +Shift by the exact elapsed time. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/DeferredField.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/DeferredField.md new file mode 100644 index 0000000..008ecd8 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/DeferredField.md @@ -0,0 +1,34 @@ + + +# DeferredField + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Represents a field that must be deferred during initial import. + +## Members + +### Properties + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the entity containing the deferred field. + +#### FieldLogicalName + +`string FieldLogicalName { get; set; }` + +Gets or sets the field logical name. + +#### TargetEntity + +`string TargetEntity { get; set; }` + +Gets or sets the target entity for the lookup. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/DependencyEdge.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/DependencyEdge.md new file mode 100644 index 0000000..03736d8 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/DependencyEdge.md @@ -0,0 +1,40 @@ + + +# DependencyEdge + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Represents a dependency edge between entities. + +## Members + +### Properties + +#### FieldName + +`string FieldName { get; set; }` + +Gets or sets the field name creating this dependency. + +#### FromEntity + +`string FromEntity { get; set; }` + +Gets or sets the source entity (the entity with the lookup field). + +#### ToEntity + +`string ToEntity { get; set; }` + +Gets or sets the target entity (the entity being referenced). + +#### Type + +`DependencyType Type { get; set; }` + +Gets or sets the type of dependency. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/DependencyGraph.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/DependencyGraph.md new file mode 100644 index 0000000..1d8fc0e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/DependencyGraph.md @@ -0,0 +1,53 @@ + + +# DependencyGraph + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Entity dependency graph for determining import order. + +## Members + +### Properties + +#### CircularReferences + +`IReadOnlyList CircularReferences { get; set; }` + +Gets or sets detected circular references. + +#### Dependencies + +`IReadOnlyList Dependencies { get; set; }` + +Gets or sets the dependency edges between entities. + +#### Entities + +`IReadOnlyList Entities { get; set; }` + +Gets or sets all entity nodes in the graph. + +#### HasCircularReferences + +`bool HasCircularReferences { get; }` + +Gets whether the graph contains circular references. + +#### TierCount + +`int TierCount { get; }` + +Gets the total number of tiers. + +#### Tiers + +`IReadOnlyList> Tiers { get; set; }` + +Gets or sets the topologically sorted tiers. +Entities within the same tier can be processed in parallel. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/DependencyType.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/DependencyType.md new file mode 100644 index 0000000..d101442 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/DependencyType.md @@ -0,0 +1,41 @@ + + +# DependencyType + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Type of dependency between entities. + +## Members + +### Fields + +#### Customer + +`DependencyType Customer` + +Customer field (account or contact). + +#### Lookup + +`DependencyType Lookup` + +Standard lookup field. + +#### Owner + +`DependencyType Owner` + +Owner field (systemuser or team). + +#### ParentChild + +`DependencyType ParentChild` + +Parent-child relationship. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/EntityNode.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/EntityNode.md new file mode 100644 index 0000000..634fa53 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/EntityNode.md @@ -0,0 +1,40 @@ + + +# EntityNode + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Represents an entity node in the dependency graph. + +## Members + +### Properties + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the entity display name. + +#### LogicalName + +`string LogicalName { get; set; }` + +Gets or sets the entity logical name. + +#### RecordCount + +`int RecordCount { get; set; }` + +Gets or sets the record count (populated during export). + +#### TierNumber + +`int TierNumber { get; set; }` + +Gets or sets the tier number this entity is assigned to. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/EntitySchema.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/EntitySchema.md new file mode 100644 index 0000000..11fb8b8 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/EntitySchema.md @@ -0,0 +1,77 @@ + + +# EntitySchema + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Schema definition for an entity. + +## Members + +### Properties + +#### DisablePlugins + +`bool DisablePlugins { get; set; }` + +Gets or sets whether to disable plugins during import. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the entity display name (e.g., "Account"). + +#### FetchXmlFilter + +`string FetchXmlFilter { get; set; }` + +Gets or sets the FetchXML filter for export (optional). + +#### Fields + +`IReadOnlyList Fields { get; set; }` + +Gets or sets the field definitions. + +#### ImportMode + +`Nullable ImportMode { get; set; }` + +Gets or sets the per-entity import mode override. +When null, the global `PPDS.Migration.Import.ImportOptions.Mode` is used. + +#### LogicalName + +`string LogicalName { get; set; }` + +Gets or sets the entity logical name (e.g., "account"). + +#### ObjectTypeCode + +`Nullable ObjectTypeCode { get; set; }` + +Gets or sets the entity type code. + +#### PrimaryIdField + +`string PrimaryIdField { get; set; }` + +Gets or sets the primary ID field name (e.g., "accountid"). + +#### PrimaryNameField + +`string PrimaryNameField { get; set; }` + +Gets or sets the primary name field (e.g., "name"). + +#### Relationships + +`IReadOnlyList Relationships { get; set; }` + +Gets or sets the relationship definitions. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/ExecutionPlan.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/ExecutionPlan.md new file mode 100644 index 0000000..59d37cf --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/ExecutionPlan.md @@ -0,0 +1,47 @@ + + +# ExecutionPlan + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Execution plan for importing data with dependency resolution. + +## Members + +### Properties + +#### DeferredFieldCount + +`int DeferredFieldCount { get; }` + +Gets the total number of deferred fields across all entities. + +#### DeferredFields + +`IReadOnlyDictionary> DeferredFields { get; set; }` + +Gets or sets fields that must be deferred (set to null initially, updated after all records exist). +Key is entity logical name, value is list of field names to defer. + +#### ManyToManyRelationships + +`IReadOnlyList ManyToManyRelationships { get; set; }` + +Gets or sets many-to-many relationships to process after entity import. + +#### TierCount + +`int TierCount { get; }` + +Gets the total number of tiers. + +#### Tiers + +`IReadOnlyList Tiers { get; set; }` + +Gets or sets the ordered tiers for import. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/FieldSchema.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/FieldSchema.md new file mode 100644 index 0000000..82b117b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/FieldSchema.md @@ -0,0 +1,114 @@ + + +# FieldSchema + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Schema definition for a field. + +## Members + +### Properties + +#### DateMode + +`DateMode DateMode { get; set; }` + +Gets or sets the date shifting mode for date/time fields. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the field display name. + +#### IsCustomField + +`bool IsCustomField { get; set; }` + +Gets or sets whether this is a custom field. + +#### IsFileColumn + +`bool IsFileColumn { get; }` + +Gets whether this field is a file column type. + +#### IsLookup + +`bool IsLookup { get; }` + +Gets whether this field is a lookup type. + +#### IsPolymorphicLookup + +`bool IsPolymorphicLookup { get; }` + +Gets whether this is a polymorphic lookup (customer, owner). + +#### IsPrimaryKey + +`bool IsPrimaryKey { get; set; }` + +Gets or sets whether this field is the primary key. + +#### IsRequired + +`bool IsRequired { get; set; }` + +Gets or sets whether the field is required. + +#### IsValidForCreate + +`bool IsValidForCreate { get; set; }` + +Gets or sets whether the field is valid for create operations. +Default is true for backwards compatibility with existing schema files. + +#### IsValidForUpdate + +`bool IsValidForUpdate { get; set; }` + +Gets or sets whether the field is valid for update operations. +Default is true for backwards compatibility with existing schema files. + +#### LogicalName + +`string LogicalName { get; set; }` + +Gets or sets the field logical name. + +#### LookupEntity + +`string LookupEntity { get; set; }` + +Gets or sets the target entity for lookup fields. + +#### MaxFileSizeKB + +`Nullable MaxFileSizeKB { get; set; }` + +Gets or sets the maximum file size in KB for file columns. + +#### MaxLength + +`Nullable MaxLength { get; set; }` + +Gets or sets the maximum length for string fields. + +#### Precision + +`Nullable Precision { get; set; }` + +Gets or sets the precision for decimal/money fields. + +#### Type + +`string Type { get; set; }` + +Gets or sets the field type (e.g., "string", "lookup", "datetime"). + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/FileColumnData.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/FileColumnData.md new file mode 100644 index 0000000..25a3735 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/FileColumnData.md @@ -0,0 +1,46 @@ + + +# FileColumnData + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Represents file column binary data for a record field. + +## Members + +### Properties + +#### Data + +`byte[] Data { get; set; }` + +Gets or sets the file binary data. + +#### FieldName + +`string FieldName { get; set; }` + +Gets or sets the file column attribute name. + +#### FileName + +`string FileName { get; set; }` + +Gets or sets the original file name. + +#### MimeType + +`string MimeType { get; set; }` + +Gets or sets the MIME type. + +#### RecordId + +`Guid RecordId { get; set; }` + +Gets or sets the record identifier. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/IdMappingCollection.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/IdMappingCollection.md new file mode 100644 index 0000000..8ee6cc3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/IdMappingCollection.md @@ -0,0 +1,90 @@ + + +# IdMappingCollection + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Tracks old-to-new GUID mappings during import. +Thread-safe for concurrent access during parallel import. + +## Members + +### Methods + +#### AddMapping + +`void AddMapping(string entityLogicalName, Guid oldId, Guid newId)` + +Adds a mapping from old ID to new ID for an entity. + +- Param `entityLogicalName`: The entity logical name. + +- Param `oldId`: The original record ID. + +- Param `newId`: The new record ID in the target environment. + +#### GetMappedEntities + +`IEnumerable GetMappedEntities()` + +Gets all entity logical names with mappings. + +#### GetMappingCount + +`int GetMappingCount(string entityLogicalName)` + +Gets the count of mappings for a specific entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: The number of mappings. + +#### GetMappingsForEntity + +`IReadOnlyDictionary GetMappingsForEntity(string entityLogicalName)` + +Gets all mappings for an entity. + +- Param `entityLogicalName`: The entity logical name. + +- Returns: Dictionary of old-to-new ID mappings. + +#### GetNewId + +`Guid GetNewId(string entityLogicalName, Guid oldId)` + +Gets the new ID for an old ID, throwing if not found. + +- Param `entityLogicalName`: The entity logical name. + +- Param `oldId`: The original record ID. + +- Returns: The new record ID. + +#### TryGetNewId + +`bool TryGetNewId(string entityLogicalName, Guid oldId, Guid newId)` + +Tries to get the new ID for an old ID. + +- Param `entityLogicalName`: The entity logical name. + +- Param `oldId`: The original record ID. + +- Param `newId`: The new record ID if found. + +- Returns: True if mapping exists, false otherwise. + + +### Properties + +#### TotalMappingCount + +`int TotalMappingCount { get; }` + +Gets the total count of mappings across all entities. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/ImportTier.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/ImportTier.md new file mode 100644 index 0000000..2088d5d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/ImportTier.md @@ -0,0 +1,40 @@ + + +# ImportTier + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Represents a tier of entities that can be imported in parallel. + +## Members + +### Properties + +#### Entities + +`IReadOnlyList Entities { get; set; }` + +Gets or sets the entities in this tier. + +#### HasCircularReferences + +`bool HasCircularReferences { get; set; }` + +Gets or sets whether this tier contains circular references. + +#### RequiresWait + +`bool RequiresWait { get; set; }` + +Gets or sets whether to wait for this tier to complete before starting next. + +#### TierNumber + +`int TierNumber { get; set; }` + +Gets or sets the tier number (0 = first). + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/ManyToManyRelationshipData.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/ManyToManyRelationshipData.md new file mode 100644 index 0000000..f0a5bbb --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/ManyToManyRelationshipData.md @@ -0,0 +1,53 @@ + + +# ManyToManyRelationshipData + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Represents grouped M2M associations for one source record. +Matches CMT data.xml format where each source has a list of targets. + +## Members + +### Properties + +#### RelationshipName + +`string RelationshipName { get; set; }` + +Gets or sets the relationship schema name. + +#### SourceEntityName + +`string SourceEntityName { get; set; }` + +Gets or sets the source entity logical name. + +#### SourceId + +`Guid SourceId { get; set; }` + +Gets or sets the source record ID. + +#### TargetEntityName + +`string TargetEntityName { get; set; }` + +Gets or sets the target entity logical name. + +#### TargetEntityPrimaryKey + +`string TargetEntityPrimaryKey { get; set; }` + +Gets or sets the target entity's primary key field name. + +#### TargetIds + +`List TargetIds { get; set; }` + +Gets or sets the target record IDs. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/MigrationData.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/MigrationData.md new file mode 100644 index 0000000..c1b5fae --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/MigrationData.md @@ -0,0 +1,61 @@ + + +# MigrationData + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Container for exported migration data. + +## Members + +### Properties + +#### EntityData + +`IReadOnlyDictionary> EntityData { get; set; }` + +Gets or sets the entity data. +Key is entity logical name, value is the list of records. + +#### ExportedAt + +`DateTime ExportedAt { get; set; }` + +Gets or sets the export timestamp. + +#### FileData + +`IReadOnlyDictionary> FileData { get; set; }` + +Gets or sets the file column data. +Key is entity logical name, value is the list of file column data for records of that entity. + +#### RelationshipData + +`IReadOnlyDictionary> RelationshipData { get; set; }` + +Gets or sets the many-to-many relationship data. +Key is entity logical name (source entity), value is list of grouped associations. + +#### Schema + +`MigrationSchema Schema { get; set; }` + +Gets or sets the schema used for this data. + +#### SourceEnvironment + +`string SourceEnvironment { get; set; }` + +Gets or sets the source environment URL. + +#### TotalRecordCount + +`int TotalRecordCount { get; }` + +Gets the total record count across all entities. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/MigrationSchema.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/MigrationSchema.md new file mode 100644 index 0000000..6314957 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/MigrationSchema.md @@ -0,0 +1,59 @@ + + +# MigrationSchema + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Parsed migration schema containing entity definitions. + +## Members + +### Methods + +#### GetAllLookupFields + +`IEnumerable> GetAllLookupFields()` + +Gets all lookup fields across all entities. + +#### GetAllManyToManyRelationships + +`IEnumerable GetAllManyToManyRelationships()` + +Gets all many-to-many relationships across all entities. + +#### GetEntity + +`EntitySchema GetEntity(string logicalName)` + +Gets an entity by its logical name. + +- Param `logicalName`: The entity logical name. + +- Returns: The entity schema, or null if not found. + + +### Properties + +#### Entities + +`IReadOnlyList Entities { get; set; }` + +Gets or sets the entity definitions. + +#### GeneratedAt + +`Nullable GeneratedAt { get; set; }` + +Gets or sets the timestamp when the schema was generated. + +#### Version + +`string Version { get; set; }` + +Gets or sets the schema version. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/RelationshipSchema.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/RelationshipSchema.md new file mode 100644 index 0000000..95e7b96 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/RelationshipSchema.md @@ -0,0 +1,71 @@ + + +# RelationshipSchema + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Schema definition for a relationship. + +## Members + +### Properties + +#### Entity1 + +`string Entity1 { get; set; }` + +Gets or sets the first entity in the relationship. + +#### Entity1Attribute + +`string Entity1Attribute { get; set; }` + +Gets or sets the attribute on the first entity. + +#### Entity2 + +`string Entity2 { get; set; }` + +Gets or sets the second entity in the relationship. + +#### Entity2Attribute + +`string Entity2Attribute { get; set; }` + +Gets or sets the attribute on the second entity. + +#### IntersectEntity + +`string IntersectEntity { get; set; }` + +Gets or sets the intersect entity name for M2M relationships. + +#### IsManyToMany + +`bool IsManyToMany { get; set; }` + +Gets or sets whether this is a many-to-many relationship. + +#### IsReflexive + +`bool IsReflexive { get; set; }` + +Gets or sets whether this is a reflexive (self-referential) relationship. + +#### Name + +`string Name { get; set; }` + +Gets or sets the relationship schema name. + +#### TargetEntityPrimaryKey + +`string TargetEntityPrimaryKey { get; set; }` + +Gets or sets the target entity's primary key field name (e.g., "roleid"). +Required for CMT format compatibility. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/UserMapping.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/UserMapping.md new file mode 100644 index 0000000..5559370 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/UserMapping.md @@ -0,0 +1,40 @@ + + +# UserMapping + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Represents a mapping from a source user to a target user. + +## Members + +### Properties + +#### SourceUserId + +`Guid SourceUserId { get; set; }` + +Gets or sets the source user ID. + +#### SourceUserName + +`string SourceUserName { get; set; }` + +Gets or sets the source user name (for reference/display). + +#### TargetUserId + +`Guid TargetUserId { get; set; }` + +Gets or sets the target user ID. + +#### TargetUserName + +`string TargetUserName { get; set; }` + +Gets or sets the target user name (for reference/display). + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Models/UserMappingCollection.md b/docs/reference/libraries/docs/reference/libraries/Migration/Models/UserMappingCollection.md new file mode 100644 index 0000000..1a98308 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Models/UserMappingCollection.md @@ -0,0 +1,53 @@ + + +# UserMappingCollection + +- Namespace: `PPDS.Migration.Models` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Collection of user mappings for migrating user references between environments. + +## Members + +### Methods + +#### TryGetMappedUserId + +`bool TryGetMappedUserId(Guid sourceUserId, Guid targetUserId)` + +Tries to get the mapped user ID for a source user. +Checks `PPDS.Migration.Models.UserMappingCollection.Mappings` first, then `PPDS.Migration.Models.UserMappingCollection.DefaultUserId`. + +- Param `sourceUserId`: The source user ID. + +- Param `targetUserId`: The mapped target user ID, or `System.Guid.Empty` if not found. + +- Returns: True if a mapping was found or `PPDS.Migration.Models.UserMappingCollection.DefaultUserId` applies; false otherwise. + + +### Properties + +#### DefaultUserId + +`Nullable DefaultUserId { get; set; }` + +Gets or sets the default user ID to use when no mapping is found. +If null, unmapped users are left as-is (unless `PPDS.Migration.Models.UserMappingCollection.UseCurrentUserAsDefault` is true). + +#### Mappings + +`Dictionary Mappings { get; set; }` + +Gets or sets the user mappings. +Key is source user ID, value is the mapping. + +#### UseCurrentUserAsDefault + +`bool UseCurrentUserAsDefault { get; set; }` + +Gets or sets whether to use the current user as the default when no mapping is found. +Checked by import logic; takes precedence over `PPDS.Migration.Models.UserMappingCollection.DefaultUserId`. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ConsoleProgressReporter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ConsoleProgressReporter.md new file mode 100644 index 0000000..f71c1ac --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ConsoleProgressReporter.md @@ -0,0 +1,60 @@ + + +# ConsoleProgressReporter + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IProgressReporter` + +## Summary + +Progress reporter that writes human-readable output to stderr. + +## Members + +### Methods + +#### Complete + +`void Complete(MigrationResult result)` + +Reports operation completion. + +- Param `result`: The migration result. + +#### Error + +`void Error(Exception exception, string context)` + +Reports an error. + +- Param `exception`: The exception that occurred. + +- Param `context`: Optional context about what was happening. + +#### Report + +`void Report(ProgressEventArgs args)` + +Reports a progress update. + +- Param `args`: The progress event data. + +#### Reset + +`void Reset()` + +Resets the progress reporter for a new operation phase. +Restarts the internal stopwatch and clears any cached state. +Use this between phases (e.g., between export and import in a copy operation). + + +### Properties + +#### OperationName + +`string OperationName { get; set; }` + +Gets or sets the operation name for completion messages (e.g., "Export", "Import", "Copy"). + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/DetailedError.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/DetailedError.md new file mode 100644 index 0000000..6e5286f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/DetailedError.md @@ -0,0 +1,64 @@ + + +# DetailedError + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Detailed error information for a single record. + +## Members + +### Properties + +#### Diagnostics + +`IReadOnlyList Diagnostics { get; set; }` + +Gets or sets diagnostics identifying which record(s) caused the batch failure. + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the entity logical name. + +#### ErrorCode + +`Nullable ErrorCode { get; set; }` + +Gets or sets the Dataverse error code. + +#### Message + +`string Message { get; set; }` + +Gets or sets the error message. + +#### Pattern + +`string Pattern { get; set; }` + +Gets or sets the detected error pattern (e.g., "MISSING_USER"). + +#### RecordId + +`Nullable RecordId { get; set; }` + +Gets or sets the record ID (GUID). + +#### RecordIndex + +`Nullable RecordIndex { get; set; }` + +Gets or sets the record index (position in batch). + +#### Timestamp + +`DateTime Timestamp { get; set; }` + +Gets or sets the timestamp when the error occurred. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/EntityErrorSummary.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/EntityErrorSummary.md new file mode 100644 index 0000000..825cf60 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/EntityErrorSummary.md @@ -0,0 +1,40 @@ + + +# EntityErrorSummary + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Per-entity error summary. + +## Members + +### Properties + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the entity logical name. + +#### FailureCount + +`int FailureCount { get; set; }` + +Gets or sets the failure count for this entity. + +#### TopErrors + +`List TopErrors { get; set; }` + +Gets or sets the most common error messages for this entity. + +#### TotalRecords + +`int TotalRecords { get; set; }` + +Gets or sets the total records for this entity. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ErrorReportWriter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ErrorReportWriter.md new file mode 100644 index 0000000..6b176e4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ErrorReportWriter.md @@ -0,0 +1,34 @@ + + +# ErrorReportWriter + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Writes comprehensive error reports for import operations. + +## Members + +### Methods + +#### WriteAsync + +`Task WriteAsync(string filePath, ImportResult result, string sourceFile, string targetEnvironment, ImportExecutionContext executionContext, CancellationToken cancellationToken)` + +Writes an error report to the specified file. + +- Param `filePath`: The output file path. + +- Param `result`: The import result. + +- Param `sourceFile`: The source data file path. + +- Param `targetEnvironment`: The target environment URL. + +- Param `executionContext`: Optional execution context for diagnostic info. + +- Param `cancellationToken`: The cancellation token. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/IProgressReporter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/IProgressReporter.md new file mode 100644 index 0000000..207d020 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/IProgressReporter.md @@ -0,0 +1,66 @@ + + +# IProgressReporter + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Interface for reporting migration progress. + +## Members + +### Methods + +#### Complete + +`void Complete(MigrationResult result)` + +Reports operation completion. + +- Param `result`: The migration result. + +#### Error + +`void Error(Exception exception, string context)` + +Reports an error. + +- Param `exception`: The exception that occurred. + +- Param `context`: Optional context about what was happening. + +#### Report + +`void Report(ProgressEventArgs args)` + +Reports a progress update. + +- Param `args`: The progress event data. + +#### Reset + +`void Reset()` + +Resets the progress reporter for a new operation phase. +Restarts the internal stopwatch and clears any cached state. +Use this between phases (e.g., between export and import in a copy operation). + + +### Properties + +#### OperationName + +`string OperationName { get; set; }` + +Gets or sets the operation name for completion messages (e.g., "Export", "Import", "Copy"). + +#### Silent + +`IProgressReporter Silent { get; }` + +A no-op reporter that silently discards all progress reports. +Use as a null object: `reporter ?? IProgressReporter.Silent`. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/IWarningCollector.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/IWarningCollector.md new file mode 100644 index 0000000..243fc6b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/IWarningCollector.md @@ -0,0 +1,41 @@ + + +# IWarningCollector + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Collects warnings during import operations. + +## Members + +### Methods + +#### AddWarning + +`void AddWarning(ImportWarning warning)` + +Adds a warning to the collection. + +- Param `warning`: The warning to add. + +#### GetWarnings + +`IReadOnlyList GetWarnings()` + +Gets all collected warnings. + +- Returns: A read-only list of warnings. + + +### Properties + +#### Count + +`int Count { get; }` + +Gets the count of collected warnings. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportErrorReport.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportErrorReport.md new file mode 100644 index 0000000..92ec89f --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportErrorReport.md @@ -0,0 +1,74 @@ + + +# ImportErrorReport + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Comprehensive error report for import operations. + +## Members + +### Properties + +#### EntitiesSummary + +`List EntitiesSummary { get; set; }` + +Gets or sets the per-entity error summaries. + +#### Errors + +`List Errors { get; set; }` + +Gets or sets all detailed errors. + +#### ExecutionContext + +`ImportExecutionContext ExecutionContext { get; set; }` + +Gets or sets the execution context for diagnostic purposes. +Added in schema version 1.1. + +#### GeneratedAt + +`DateTime GeneratedAt { get; set; }` + +Gets or sets the timestamp when this report was generated. + +#### RetryManifest + +`RetryManifest RetryManifest { get; set; }` + +Gets or sets the retry manifest for failed records. + +#### SourceFile + +`string SourceFile { get; set; }` + +Gets or sets the source data file path. + +#### Summary + +`ImportErrorSummary Summary { get; set; }` + +Gets or sets the import summary statistics. + +#### TargetEnvironment + +`string TargetEnvironment { get; set; }` + +Gets or sets the target environment URL. + +#### Version + +`string Version { get; set; }` + +Gets or sets the schema version of this report. +Version history: +- 1.0: Initial schema +- 1.1: Added ExecutionContext for version/environment diagnostics + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportErrorSummary.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportErrorSummary.md new file mode 100644 index 0000000..24c9765 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportErrorSummary.md @@ -0,0 +1,47 @@ + + +# ImportErrorSummary + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Summary statistics for an import operation. + +## Members + +### Properties + +#### Duration + +`TimeSpan Duration { get; set; }` + +Gets or sets the total import duration. + +#### ErrorPatterns + +`Dictionary ErrorPatterns { get; set; }` + +Gets or sets error patterns and their counts. +Keys are pattern names (e.g., "MISSING_USER"), values are occurrence counts. + +#### FailureCount + +`int FailureCount { get; set; }` + +Gets or sets the number of failed records. + +#### SuccessCount + +`int SuccessCount { get; set; }` + +Gets or sets the number of successful records. + +#### TotalRecords + +`int TotalRecords { get; set; }` + +Gets or sets the total number of records attempted. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportExecutionContext.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportExecutionContext.md new file mode 100644 index 0000000..79f94ea --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportExecutionContext.md @@ -0,0 +1,65 @@ + + +# ImportExecutionContext + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Execution context capturing version and environment information for diagnostics. +Helps correlate import issues to specific CLI/SDK versions. + +## Members + +### Properties + +#### BypassPlugins + +`bool BypassPlugins { get; set; }` + +Gets or sets whether plugins were bypassed during import. + +#### CliVersion + +`string CliVersion { get; set; }` + +Gets or sets the CLI tool version (e.g., "1.2.3"). + +#### ImportMode + +`string ImportMode { get; set; }` + +Gets or sets the import mode used (e.g., "Create", "Update", "Upsert"). + +#### Platform + +`string Platform { get; set; }` + +Gets or sets the platform description (e.g., "Windows 10.0.22631"). + +#### RuntimeVersion + +`string RuntimeVersion { get; set; }` + +Gets or sets the .NET runtime version (e.g., "8.0.1"). + +#### SdkVersion + +`string SdkVersion { get; set; }` + +Gets or sets the SDK version (PPDS.Dataverse, e.g., "1.2.3"). + +#### StripOwnerFields + +`bool StripOwnerFields { get; set; }` + +Gets or sets whether owner fields were stripped during import. + +#### UserMappingProvided + +`bool UserMappingProvided { get; set; }` + +Gets or sets whether a user mapping file was provided. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportOutputManager.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportOutputManager.md new file mode 100644 index 0000000..bb1bb7b --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportOutputManager.md @@ -0,0 +1,142 @@ + + +# ImportOutputManager + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IAsyncDisposable`, `IDisposable` + +## Summary + +Manages streaming output for import operations. + +## Members + +### Constructors + +#### ImportOutputManager(string basePath) + +`ImportOutputManager(string basePath)` + +Creates a new output manager for the specified base path. + +- Param `basePath`: Base path for output files. Files will be created as: +{basePath}.errors.jsonl, {basePath}.progress.log, {basePath}.summary.json + + +### Methods + +#### Dispose + +`void Dispose()` + +*(inherited from `System.IDisposable.Dispose`)* + +#### DisposeAsync + +`ValueTask DisposeAsync()` + +*(inherited from `System.IAsyncDisposable.DisposeAsync`)* + +#### LogEntityError + +`void LogEntityError(string entityLogicalName, int failedRecords, string errorSummary)` + +Logs an entity-level error summary. +Thread-safe. + +- Param `entityLogicalName`: Entity logical name. + +- Param `failedRecords`: Number of failed records. + +- Param `errorSummary`: Brief error description. + +#### LogEntityProgress + +`void LogEntityProgress(string entityLogicalName, int processed, int total, double recordsPerSecond)` + +Logs entity progress with rate information. +Thread-safe. + +- Param `entityLogicalName`: Entity logical name. + +- Param `processed`: Records processed. + +- Param `total`: Total records. + +- Param `recordsPerSecond`: Current throughput. + +#### LogError + +`void LogError(MigrationError error)` + +Logs an error immediately to the errors file. +Thread-safe. + +- Param `error`: The error to log. + +#### LogProgress + +`void LogProgress(string message)` + +Logs a progress message immediately to the progress log. +Thread-safe. + +- Param `message`: The progress message. + +#### LogTierStart + +`void LogTierStart(int tierNumber, string[] entityNames)` + +Logs the start of a tier. +Thread-safe. + +- Param `tierNumber`: Tier number. + +- Param `entityNames`: Entities in this tier. + +#### WriteSummaryAsync + +`Task WriteSummaryAsync(ImportResult result, string sourceFile, string targetEnvironment, ImportExecutionContext executionContext, CancellationToken cancellationToken)` + +Writes the final summary to the summary file. +Should be called on import completion (success, failure, or cancellation). + +- Param `result`: The import result. + +- Param `sourceFile`: Source data file path. + +- Param `targetEnvironment`: Target environment URL. + +- Param `executionContext`: Optional execution context. + +- Param `cancellationToken`: Cancellation token. + + +### Properties + +#### ErrorCount + +`int ErrorCount { get; }` + +Gets the number of errors logged so far. + +#### ErrorsPath + +`string ErrorsPath { get; }` + +Gets the path to the errors file (.errors.jsonl). + +#### ProgressPath + +`string ProgressPath { get; }` + +Gets the path to the progress log file (.progress.log). + +#### SummaryPath + +`string SummaryPath { get; }` + +Gets the path to the summary file (.summary.json). + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportWarning.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportWarning.md new file mode 100644 index 0000000..1d55a80 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportWarning.md @@ -0,0 +1,40 @@ + + +# ImportWarning + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Represents a warning that occurred during import. + +## Members + +### Properties + +#### Code + +`string Code { get; set; }` + +Gets or sets the warning code. + +#### Entity + +`string Entity { get; set; }` + +Gets or sets the affected entity (optional). + +#### Impact + +`string Impact { get; set; }` + +Gets or sets the impact assessment (optional). + +#### Message + +`string Message { get; set; }` + +Gets or sets the human-readable warning message. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportWarningCodes.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportWarningCodes.md new file mode 100644 index 0000000..3786ff7 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ImportWarningCodes.md @@ -0,0 +1,53 @@ + + +# ImportWarningCodes + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Standard warning codes for import operations. + +## Members + +### Fields + +#### BulkNotSupported + +`string BulkNotSupported` + +Entity does not support bulk operations, fell back to individual operations. + +#### ColumnSkipped + +`string ColumnSkipped` + +Column in source but not in target (skipped). + +#### PluginReenableFailed + +`string PluginReenableFailed` + +Failed to re-enable plugin steps after import. + +#### RoleMappingSkipped + +`string RoleMappingSkipped` + +M2M role mapping was skipped because no matching role could be found in the target environment. +Emitted by RelationshipProcessor when cross-environment role lookup by ID fails. + +#### SchemaMismatch + +`string SchemaMismatch` + +Non-fatal schema differences detected. + +#### UserMappingFallback + +`string UserMappingFallback` + +User reference fell back to current user. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/JsonProgressReporter.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/JsonProgressReporter.md new file mode 100644 index 0000000..1b27a91 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/JsonProgressReporter.md @@ -0,0 +1,79 @@ + + +# JsonProgressReporter + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IProgressReporter` + +## Summary + +Progress reporter that writes JSON lines to a TextWriter. +Used for CLI and VS Code extension integration. + +## Members + +### Constructors + +#### JsonProgressReporter(TextWriter writer) + +`JsonProgressReporter(TextWriter writer)` + +Initializes a new instance of the `PPDS.Migration.Progress.JsonProgressReporter` class. + +- Param `writer`: The text writer to output JSON lines to. + + +### Methods + +#### Complete + +`void Complete(MigrationResult result)` + +Reports operation completion. + +- Param `result`: The migration result. + +#### Error + +`void Error(Exception exception, string context)` + +Reports an error. + +- Param `exception`: The exception that occurred. + +- Param `context`: Optional context about what was happening. + +#### Report + +`void Report(ProgressEventArgs args)` + +Reports a progress update. + +- Param `args`: The progress event data. + +#### Reset + +`void Reset()` + +Resets the progress reporter for a new operation phase. +Restarts the internal stopwatch and clears any cached state. +Use this between phases (e.g., between export and import in a copy operation). + + +### Properties + +#### OperationName + +`string OperationName { get; set; }` + +Gets or sets the operation name for completion messages (e.g., "Export", "Import", "Copy"). + +#### ReportInterval + +`int ReportInterval { get; set; }` + +Gets or sets the minimum interval between progress reports (in records). +Default is 100 to avoid flooding output. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/MigrationError.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/MigrationError.md new file mode 100644 index 0000000..be119f4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/MigrationError.md @@ -0,0 +1,66 @@ + + +# MigrationError + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Error information from a migration operation. +Contains RecordId (GUID) for correlation but no record data to avoid PII exposure. + +## Members + +### Properties + +#### Diagnostics + +`IReadOnlyList Diagnostics { get; set; }` + +Gets or sets diagnostics identifying which record(s) caused the batch failure. + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the entity logical name. + +#### ErrorCode + +`Nullable ErrorCode { get; set; }` + +Gets or sets the Dataverse error code. + +#### Message + +`string Message { get; set; }` + +Gets or sets a safe error message (no PII). + +#### Phase + +`MigrationPhase Phase { get; set; }` + +Gets or sets the phase where the error occurred. + +#### RecordId + +`Nullable RecordId { get; set; }` + +Gets or sets the record ID (GUID). +This is a unique identifier, not PII. + +#### RecordIndex + +`Nullable RecordIndex { get; set; }` + +Gets or sets the record index (position in batch). + +#### Timestamp + +`DateTime Timestamp { get; set; }` + +Gets or sets the timestamp when the error occurred. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/MigrationPhase.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/MigrationPhase.md new file mode 100644 index 0000000..43f665a --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/MigrationPhase.md @@ -0,0 +1,65 @@ + + +# MigrationPhase + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Phase of the migration operation. + +## Members + +### Fields + +#### Analyzing + +`MigrationPhase Analyzing` + +Analyzing schema and building dependency graph. + +#### Complete + +`MigrationPhase Complete` + +Operation completed successfully. + +#### Error + +`MigrationPhase Error` + +Operation encountered an error. + +#### Exporting + +`MigrationPhase Exporting` + +Exporting data from source environment. + +#### Importing + +`MigrationPhase Importing` + +Importing data to target environment. + +#### ProcessingDeferredFields + +`MigrationPhase ProcessingDeferredFields` + +Processing deferred lookup fields. + +#### ProcessingRelationships + +`MigrationPhase ProcessingRelationships` + +Processing many-to-many relationships. + +#### ProcessingStateTransitions + +`MigrationPhase ProcessingStateTransitions` + +Processing state/status transitions on imported records. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/MigrationResult.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/MigrationResult.md new file mode 100644 index 0000000..6b1e24a --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/MigrationResult.md @@ -0,0 +1,98 @@ + + +# MigrationResult + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Result of a migration operation. + +## Members + +### Properties + +#### CreatedCount + +`Nullable CreatedCount { get; set; }` + +Gets or sets the number of records created during upsert operations. +Only populated for upsert mode; null for create/update modes. + +#### Duration + +`TimeSpan Duration { get; set; }` + +Gets or sets the operation duration. + +#### Errors + +`IReadOnlyList Errors { get; set; }` + +Gets or sets the errors encountered. + +#### FailureCount + +`int FailureCount { get; set; }` + +Gets or sets the count of failed operations. + +#### M2MCount + +`Nullable M2MCount { get; set; }` + +Gets or sets the number of M2M (many-to-many) relationship records processed. +Only populated for import operations; null otherwise. + +#### PoolStatistics + +`PoolStatistics PoolStatistics { get; set; }` + +Gets or sets the connection pool statistics at the end of the operation. + +#### RecordsPerSecond + +`double RecordsPerSecond { get; }` + +Gets the average records per second. + +#### RecordsProcessed + +`int RecordsProcessed { get; set; }` + +Gets or sets the total records processed. + +#### RelationshipsFailed + +`Nullable RelationshipsFailed { get; set; }` + +Gets or sets the number of M2M relationship failures. +Only populated for import operations; null otherwise. + +#### SourceRecordCount + +`Nullable SourceRecordCount { get; set; }` + +Gets or sets the number of records in the source data file. + +#### Success + +`bool Success { get; set; }` + +Gets or sets whether the operation was successful. + +#### SuccessCount + +`int SuccessCount { get; set; }` + +Gets or sets the count of successful operations. + +#### UpdatedCount + +`Nullable UpdatedCount { get; set; }` + +Gets or sets the number of records updated during upsert operations. +Only populated for upsert mode; null for create/update modes. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/OperationClock.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/OperationClock.md new file mode 100644 index 0000000..5093e41 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/OperationClock.md @@ -0,0 +1,34 @@ + + +# OperationClock + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Provides elapsed time since the current operation started. +Call `PPDS.Migration.Progress.OperationClock.Start` at the beginning of each CLI command. + +## Members + +### Methods + +#### Start + +`void Start()` + +Starts or restarts the operation clock. +Call at the beginning of each CLI command. + + +### Properties + +#### Elapsed + +`TimeSpan Elapsed { get; }` + +Gets the elapsed time since `PPDS.Migration.Progress.OperationClock.Start` was called. +Returns `System.TimeSpan.Zero` if not started. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ProgressAdapterFactory.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ProgressAdapterFactory.md new file mode 100644 index 0000000..372dbef --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ProgressAdapterFactory.md @@ -0,0 +1,32 @@ + + +# ProgressAdapterFactory + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Creates `System.IProgress`1` adapters that bridge +`PPDS.Dataverse.Progress.ProgressSnapshot` to `PPDS.Migration.Progress.IProgressReporter`. + +## Members + +### Methods + +#### Create + +`IProgress Create(IProgressReporter reporter, Func mapper)` + +Creates an `System.IProgress`1` that maps each snapshot +to a `PPDS.Migration.Progress.ProgressEventArgs` via the supplied `mapper` +and forwards it to the `reporter`. + +- Param `reporter`: The progress reporter to forward to. + +- Param `mapper`: A function that converts a `PPDS.Dataverse.Progress.ProgressSnapshot` +into a `PPDS.Migration.Progress.ProgressEventArgs`. + +- Returns: An `System.IProgress`1` adapter. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ProgressEventArgs.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ProgressEventArgs.md new file mode 100644 index 0000000..4470450 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/ProgressEventArgs.md @@ -0,0 +1,156 @@ + + +# ProgressEventArgs + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class +- Base: `EventArgs` + +## Summary + +Progress event data for migration operations. + +## Members + +### Properties + +#### Current + +`int Current { get; set; }` + +Gets or sets the current record/item count. + +#### CurrentEntityIndex + +`Nullable CurrentEntityIndex { get; set; }` + +Gets or sets the current entity index (1-based). + +#### Entity + +`string Entity { get; set; }` + +Gets or sets the entity being processed (if applicable). + +#### ErrorSamples + +`IReadOnlyList ErrorSamples { get; set; }` + +Gets or sets sample errors from the current batch for real-time visibility. +Limited to a small number (typically 2) to avoid flooding output. + +#### EstimatedRemaining + +`Nullable EstimatedRemaining { get; set; }` + +Gets or sets the estimated time remaining for the current entity/operation. + +#### FailureCount + +`int FailureCount { get; set; }` + +Gets or sets the number of records that failed in the current batch/phase. + +#### Field + +`string Field { get; set; }` + +Gets or sets the field being processed (for deferred fields). + +#### FilterApplied + +`bool FilterApplied { get; set; }` + +Gets or sets whether a FetchXML filter is applied for this entity export. + +#### FilterDescription + +`string FilterDescription { get; set; }` + +Gets or sets the filter description (summarized FetchXML filter conditions). + +#### Message + +`string Message { get; set; }` + +Gets or sets a descriptive message. + +#### OverallPercentComplete + +`double OverallPercentComplete { get; }` + +Gets the overall percentage complete across all entities (0-100). + +#### OverallProcessed + +`Nullable OverallProcessed { get; set; }` + +Gets or sets the overall records processed across all entities. + +#### OverallTotal + +`Nullable OverallTotal { get; set; }` + +Gets or sets the overall total records across all entities. + +#### PercentComplete + +`double PercentComplete { get; }` + +Gets the percentage complete (0-100). + +#### Phase + +`MigrationPhase Phase { get; set; }` + +Gets or sets the current phase of the migration. + +#### RecordsPerSecond + +`Nullable RecordsPerSecond { get; set; }` + +Gets or sets the records per second rate. + +#### Relationship + +`string Relationship { get; set; }` + +Gets or sets the relationship being processed (for M2M). + +#### SuccessCount + +`int SuccessCount { get; set; }` + +Gets or sets the number of records that succeeded in the current batch/phase. + +#### TierNumber + +`Nullable TierNumber { get; set; }` + +Gets or sets the current tier number (for import). + +#### Timestamp + +`DateTime Timestamp { get; set; }` + +Gets or sets the timestamp of this progress event. + +#### Total + +`int Total { get; set; }` + +Gets or sets the total record/item count. + +#### TotalEntities + +`Nullable TotalEntities { get; set; }` + +Gets or sets the total number of entities to process. + +#### TotalTiers + +`Nullable TotalTiers { get; set; }` + +Gets or sets the total number of tiers in the import plan. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/RetryManifest.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/RetryManifest.md new file mode 100644 index 0000000..a113901 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/RetryManifest.md @@ -0,0 +1,41 @@ + + +# RetryManifest + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Manifest of failed records for retry operations. +Can be used as input filter for subsequent import. + +## Members + +### Properties + +#### FailedRecordsByEntity + +`Dictionary> FailedRecordsByEntity { get; set; }` + +Gets or sets the failed record IDs grouped by entity. + +#### GeneratedAt + +`DateTime GeneratedAt { get; set; }` + +Gets or sets the timestamp when this manifest was generated. + +#### SourceFile + +`string SourceFile { get; set; }` + +Gets or sets the source file this manifest was generated from. + +#### Version + +`string Version { get; set; }` + +Gets or sets the schema version of this manifest. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Progress/WarningCollector.md b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/WarningCollector.md new file mode 100644 index 0000000..520c108 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Progress/WarningCollector.md @@ -0,0 +1,42 @@ + + +# WarningCollector + +- Namespace: `PPDS.Migration.Progress` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IWarningCollector` + +## Summary + +Thread-safe implementation of `PPDS.Migration.Progress.IWarningCollector`. + +## Members + +### Methods + +#### AddWarning + +`void AddWarning(ImportWarning warning)` + +Adds a warning to the collection. + +- Param `warning`: The warning to add. + +#### GetWarnings + +`IReadOnlyList GetWarnings()` + +Gets all collected warnings. + +- Returns: A read-only list of warnings. + + +### Properties + +#### Count + +`int Count { get; }` + +Gets the count of collected warnings. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Schema/DataverseSchemaGenerator.md b/docs/reference/libraries/docs/reference/libraries/Migration/Schema/DataverseSchemaGenerator.md new file mode 100644 index 0000000..a6d59e0 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Schema/DataverseSchemaGenerator.md @@ -0,0 +1,56 @@ + + +# DataverseSchemaGenerator + +- Namespace: `PPDS.Migration.Schema` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `ISchemaGenerator` + +## Summary + +Generates migration schemas from Dataverse metadata. + +## Members + +### Constructors + +#### DataverseSchemaGenerator(IDataverseConnectionPool connectionPool, ILogger logger) + +`DataverseSchemaGenerator(IDataverseConnectionPool connectionPool, ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.Schema.DataverseSchemaGenerator` class. + +- Param `connectionPool`: The connection pool. + +- Param `logger`: Optional logger. + + +### Methods + +#### GenerateAsync + +`Task GenerateAsync(IEnumerable entityLogicalNames, SchemaGeneratorOptions options, IProgressReporter progress, CancellationToken cancellationToken)` + +Generates a migration schema for the specified entities. + +- Param `entityLogicalNames`: The logical names of entities to include. + +- Param `options`: Schema generation options. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The generated migration schema. + +#### GetAvailableEntitiesAsync + +`Task> GetAvailableEntitiesAsync(CancellationToken cancellationToken)` + +Gets available entities from Dataverse. + +- Param `cancellationToken`: Cancellation token. + +- Returns: List of entity logical names and display names. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Schema/EntityInfo.md b/docs/reference/libraries/docs/reference/libraries/Migration/Schema/EntityInfo.md new file mode 100644 index 0000000..bac5e7c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Schema/EntityInfo.md @@ -0,0 +1,40 @@ + + +# EntityInfo + +- Namespace: `PPDS.Migration.Schema` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Basic entity information. + +## Members + +### Properties + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the entity display name. + +#### IsCustomEntity + +`bool IsCustomEntity { get; set; }` + +Gets or sets whether this is a custom entity. + +#### LogicalName + +`string LogicalName { get; set; }` + +Gets or sets the entity logical name. + +#### ObjectTypeCode + +`int ObjectTypeCode { get; set; }` + +Gets or sets the entity type code. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Schema/ISchemaGenerator.md b/docs/reference/libraries/docs/reference/libraries/Migration/Schema/ISchemaGenerator.md new file mode 100644 index 0000000..a667b51 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Schema/ISchemaGenerator.md @@ -0,0 +1,42 @@ + + +# ISchemaGenerator + +- Namespace: `PPDS.Migration.Schema` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Interface for generating migration schemas from Dataverse metadata. + +## Members + +### Methods + +#### GenerateAsync + +`Task GenerateAsync(IEnumerable entityLogicalNames, SchemaGeneratorOptions options, IProgressReporter progress, CancellationToken cancellationToken)` + +Generates a migration schema for the specified entities. + +- Param `entityLogicalNames`: The logical names of entities to include. + +- Param `options`: Schema generation options. + +- Param `progress`: Optional progress reporter. + +- Param `cancellationToken`: Cancellation token. + +- Returns: The generated migration schema. + +#### GetAvailableEntitiesAsync + +`Task> GetAvailableEntitiesAsync(CancellationToken cancellationToken)` + +Gets available entities from Dataverse. + +- Param `cancellationToken`: Cancellation token. + +- Returns: List of entity logical names and display names. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/Schema/SchemaGeneratorOptions.md b/docs/reference/libraries/docs/reference/libraries/Migration/Schema/SchemaGeneratorOptions.md new file mode 100644 index 0000000..dcffbbd --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/Schema/SchemaGeneratorOptions.md @@ -0,0 +1,69 @@ + + +# SchemaGeneratorOptions + +- Namespace: `PPDS.Migration.Schema` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Options for schema generation. + +## Members + +### Methods + +#### ShouldIncludeAttribute + +`bool ShouldIncludeAttribute(string attributeName, bool isPrimaryKey)` + +Determines if an attribute should be included based on the filtering options. + +- Param `attributeName`: The attribute logical name. + +- Param `isPrimaryKey`: Whether this attribute is the primary key. + +- Returns: True if the attribute should be included. + + +### Properties + +#### CustomFieldsOnly + +`bool CustomFieldsOnly { get; set; }` + +Gets or sets whether to include only custom fields. Default: false. + +#### DisablePluginsByDefault + +`bool DisablePluginsByDefault { get; set; }` + +Gets or sets the default value for disabling plugins during import. Default: false. + +#### ExcludeAttributes + +`IReadOnlyList ExcludeAttributes { get; set; }` + +Gets or sets the attributes to exclude (blacklist). If set, these attributes are excluded. +Ignored if IncludeAttributes is set. + +#### IncludeAllFields + +`bool IncludeAllFields { get; set; }` + +Gets or sets whether to include all fields. Default: true. + +#### IncludeAttributes + +`IReadOnlyList IncludeAttributes { get; set; }` + +Gets or sets the attributes to include (whitelist). If set, only these attributes are included. +Takes precedence over ExcludeAttributes. Primary key is always included. + +#### IncludeAuditFields + +`bool IncludeAuditFields { get; set; }` + +Gets or sets whether to include audit fields (createdon, createdby, modifiedon, modifiedby, etc.). Default: false. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/IUserMappingGenerator.md b/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/IUserMappingGenerator.md new file mode 100644 index 0000000..6d468ee --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/IUserMappingGenerator.md @@ -0,0 +1,28 @@ + + +# IUserMappingGenerator + +- Namespace: `PPDS.Migration.UserMapping` +- Assembly: `PPDS.Migration` +- Kind: Interface + +## Summary + +Interface for generating user mappings. + +## Members + +### Methods + +#### GenerateAsync + +`Task GenerateAsync(IDataverseConnectionPool sourcePool, IDataverseConnectionPool targetPool, UserMappingOptions options, CancellationToken cancellationToken)` + +Generates user mappings between source and target environments. + +#### WriteAsync + +`Task WriteAsync(UserMappingResult result, string outputPath, CancellationToken cancellationToken)` + +Writes user mappings to an XML file. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserInfo.md b/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserInfo.md new file mode 100644 index 0000000..341ac11 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserInfo.md @@ -0,0 +1,58 @@ + + +# UserInfo + +- Namespace: `PPDS.Migration.UserMapping` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Information about a system user. + +## Members + +### Properties + +#### AadObjectId + +`Nullable AadObjectId { get; set; }` + +Gets or sets the Azure AD Object ID. + +#### AccessMode + +`int AccessMode { get; set; }` + +Gets or sets the access mode. + +#### DomainName + +`string DomainName { get; set; }` + +Gets or sets the domain name (UPN). + +#### Email + +`string Email { get; set; }` + +Gets or sets the email address. + +#### FullName + +`string FullName { get; set; }` + +Gets or sets the full name. + +#### IsDisabled + +`bool IsDisabled { get; set; }` + +Gets or sets whether the user is disabled. + +#### SystemUserId + +`Guid SystemUserId { get; set; }` + +Gets or sets the system user ID. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserMappingGenerator.md b/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserMappingGenerator.md new file mode 100644 index 0000000..c5c190c --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserMappingGenerator.md @@ -0,0 +1,47 @@ + + +# UserMappingGenerator + +- Namespace: `PPDS.Migration.UserMapping` +- Assembly: `PPDS.Migration` +- Kind: Class +- Implements: `IUserMappingGenerator` + +## Summary + +Generates user mapping files for cross-environment migration. +Matches users by Azure AD Object ID or domain name. + +## Members + +### Constructors + +#### UserMappingGenerator() + +`UserMappingGenerator()` + +Initializes a new instance of the `PPDS.Migration.UserMapping.UserMappingGenerator` class. + +#### UserMappingGenerator(ILogger logger) + +`UserMappingGenerator(ILogger logger)` + +Initializes a new instance of the `PPDS.Migration.UserMapping.UserMappingGenerator` class. + +- Param `logger`: The logger. + + +### Methods + +#### GenerateAsync + +`Task GenerateAsync(IDataverseConnectionPool sourcePool, IDataverseConnectionPool targetPool, UserMappingOptions options, CancellationToken cancellationToken)` + +Generates user mappings between source and target environments. + +#### WriteAsync + +`Task WriteAsync(UserMappingResult result, string outputPath, CancellationToken cancellationToken)` + +Writes user mappings to an XML file. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserMappingMatch.md b/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserMappingMatch.md new file mode 100644 index 0000000..aa5c1b0 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserMappingMatch.md @@ -0,0 +1,34 @@ + + +# UserMappingMatch + +- Namespace: `PPDS.Migration.UserMapping` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +A matched user mapping. + +## Members + +### Properties + +#### MatchedBy + +`string MatchedBy { get; set; }` + +Gets or sets how the match was determined. + +#### Source + +`UserInfo Source { get; set; }` + +Gets or sets the source user. + +#### Target + +`UserInfo Target { get; set; }` + +Gets or sets the target user. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserMappingOptions.md b/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserMappingOptions.md new file mode 100644 index 0000000..bdeb57d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserMappingOptions.md @@ -0,0 +1,22 @@ + + +# UserMappingOptions + +- Namespace: `PPDS.Migration.UserMapping` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Options for user mapping generation. + +## Members + +### Properties + +#### IncludeDisabledUsers + +`bool IncludeDisabledUsers { get; set; }` + +Gets or sets whether to include disabled users. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserMappingResult.md b/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserMappingResult.md new file mode 100644 index 0000000..fff9959 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/UserMapping/UserMappingResult.md @@ -0,0 +1,52 @@ + + +# UserMappingResult + +- Namespace: `PPDS.Migration.UserMapping` +- Assembly: `PPDS.Migration` +- Kind: Class + +## Summary + +Result of user mapping generation. + +## Members + +### Properties + +#### Mappings + +`IReadOnlyList Mappings { get; set; }` + +Gets or sets the matched user mappings. + +#### MatchedByAadId + +`int MatchedByAadId { get; set; }` + +Gets or sets the count of users matched by AAD Object ID. + +#### MatchedByDomain + +`int MatchedByDomain { get; set; }` + +Gets or sets the count of users matched by domain name. + +#### SourceUserCount + +`int SourceUserCount { get; set; }` + +Gets or sets the number of users in the source environment. + +#### TargetUserCount + +`int TargetUserCount { get; set; }` + +Gets or sets the number of users in the target environment. + +#### UnmappedUsers + +`IReadOnlyList UnmappedUsers { get; set; }` + +Gets or sets the unmapped source users. + diff --git a/docs/reference/libraries/docs/reference/libraries/Migration/_index.md b/docs/reference/libraries/docs/reference/libraries/Migration/_index.md new file mode 100644 index 0000000..6721f60 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Migration/_index.md @@ -0,0 +1,143 @@ + + +# Migration reference + +## Interfaces + +| Type | Summary | +|------|---------| +| [ICmtDataReader](./Formats/ICmtDataReader.md) | Interface for reading CMT data files. | +| [ICmtDataWriter](./Formats/ICmtDataWriter.md) | Interface for writing CMT-compatible data files. | +| [ICmtSchemaReader](./Formats/ICmtSchemaReader.md) | Interface for reading CMT schema files. | +| [ICmtSchemaWriter](./Formats/ICmtSchemaWriter.md) | Interface for writing CMT-compatible schema files. | +| [IDependencyGraphBuilder](./Analysis/IDependencyGraphBuilder.md) | Interface for building entity dependency graphs from schemas. | +| [IExecutionPlanBuilder](./Analysis/IExecutionPlanBuilder.md) | Interface for building execution plans from dependency graphs. | +| [IExporter](./Export/IExporter.md) | Interface for exporting data from Dataverse. | +| [IImportPhaseProcessor](./Import/IImportPhaseProcessor.md) | Processes a phase of the import pipeline. | +| [IImporter](./Import/IImporter.md) | Interface for importing data to Dataverse. | +| [IPluginStepManager](./Import/IPluginStepManager.md) | Interface for managing plugin steps during import. | +| [IPostImportHandler](./Import/Handlers/IPostImportHandler.md) | Executes post-import processing for an entity. | +| [IProgressReporter](./Progress/IProgressReporter.md) | Interface for reporting migration progress. | +| [IRecordFilter](./Import/Handlers/IRecordFilter.md) | Filters records during import, determining which should be skipped. | +| [IRecordTransformer](./Import/Handlers/IRecordTransformer.md) | Transforms records before they are imported. | +| [ISchemaGenerator](./Schema/ISchemaGenerator.md) | Interface for generating migration schemas from Dataverse metadata. | +| [ISchemaValidator](./Import/ISchemaValidator.md) | Validates schema compatibility between exported data and target environment. | +| [IStateTransitionHandler](./Import/Handlers/IStateTransitionHandler.md) | Determines state transitions to apply to records after import. | +| [IUserMappingGenerator](./UserMapping/IUserMappingGenerator.md) | Interface for generating user mappings. | +| [IUserMappingReader](./Formats/IUserMappingReader.md) | Interface for reading user mappings. | +| [IWarningCollector](./Progress/IWarningCollector.md) | Collects warnings during import operations. | + +## Classes + +| Type | Summary | +|------|---------| +| [ActivityPointerHandler](./Import/Handlers/ActivityPointerHandler.md) | Filters activitypointer base type records — always skipped because | +| [AttributeNames](./Constants/AttributeNames.md) | Dataverse attribute logical names used in migration operations. | +| [BulkOperationProber](./Import/BulkOperationProber.md) | Probes entities to detect bulk operation support and executes appropriate strategy. | +| [BusinessUnitHandler](./Import/Handlers/BusinessUnitHandler.md) | Transforms business unit records during import. | +| [CircularReference](./Models/CircularReference.md) | Represents a circular reference between entities. | +| [CmtDataReader](./Formats/CmtDataReader.md) | Reads CMT data.zip files. | +| [CmtDataWriter](./Formats/CmtDataWriter.md) | Writes CMT-compatible data.zip files. | +| [CmtSchemaReader](./Formats/CmtSchemaReader.md) | Reads CMT schema.xml files. | +| [CmtSchemaWriter](./Formats/CmtSchemaWriter.md) | Writes CMT-compatible schema files. | +| [ConsoleProgressReporter](./Progress/ConsoleProgressReporter.md) | Progress reporter that writes human-readable output to stderr. | +| [DataverseSchemaGenerator](./Schema/DataverseSchemaGenerator.md) | Generates migration schemas from Dataverse metadata. | +| [DateShifter](./Import/DateShifter.md) | Shifts date/time values based on the configured `PPDS.Migration.Models.DateMode`. | +| [DeferredField](./Models/DeferredField.md) | Represents a field that must be deferred during initial import. | +| [DeferredFieldProcessor](./Import/DeferredFieldProcessor.md) | Processes deferred fields after the initial entity import. | +| [DependencyEdge](./Models/DependencyEdge.md) | Represents a dependency edge between entities. | +| [DependencyGraph](./Models/DependencyGraph.md) | Entity dependency graph for determining import order. | +| [DependencyGraphBuilder](./Analysis/DependencyGraphBuilder.md) | Builds entity dependency graphs using Tarjan's algorithm for cycle detection. | +| [DetailedError](./Progress/DetailedError.md) | Detailed error information for a single record. | +| [DuplicateRuleHandler](./Import/Handlers/DuplicateRuleHandler.md) | Handles duplicate rule records during import. | +| [EntityErrorSummary](./Progress/EntityErrorSummary.md) | Per-entity error summary. | +| [EntityExportResult](./Export/EntityExportResult.md) | Result for a single entity export. | +| [EntityImportResult](./Import/EntityImportResult.md) | Result for a single entity import. | +| [EntityInfo](./Schema/EntityInfo.md) | Basic entity information. | +| [EntityNames](./Constants/EntityNames.md) | Dataverse entity logical names used in migration operations. | +| [EntityNode](./Models/EntityNode.md) | Represents an entity node in the dependency graph. | +| [EntityReferenceMapper](./Import/EntityReferenceMapper.md) | Resolves entity references using cascading lookup resolution. | +| [EntitySchema](./Models/EntitySchema.md) | Schema definition for an entity. | +| [ErrorReportWriter](./Progress/ErrorReportWriter.md) | Writes comprehensive error reports for import operations. | +| [ExecutionPlan](./Models/ExecutionPlan.md) | Execution plan for importing data with dependency resolution. | +| [ExecutionPlanBuilder](./Analysis/ExecutionPlanBuilder.md) | Builds execution plans with deferred field identification. | +| [ExportOptions](./Export/ExportOptions.md) | Options for export operations. | +| [ExportResult](./Export/ExportResult.md) | Result of an export operation. | +| [ExportWarningCodes](./Export/ExportWarningCodes.md) | Standard warning codes for export operations. | +| [FieldMetadataCollection](./Import/FieldMetadataCollection.md) | Collection of field metadata for multiple entities. | +| [FieldSchema](./Models/FieldSchema.md) | Schema definition for a field. | +| [FileColumnData](./Models/FileColumnData.md) | Represents file column binary data for a record field. | +| [FileColumnProcessor](./Import/FileColumnProcessor.md) | Processes file column data after record import. | +| [FileColumnTransferHelper](./Import/FileColumnTransferHelper.md) | Handles chunked upload/download of file column binary data. | +| [GuidPartitioner](./Export/GuidPartitioner.md) | Splits the GUID space into non-overlapping ranges for parallel export. | +| [IdMappingCollection](./Models/IdMappingCollection.md) | Tracks old-to-new GUID mappings during import. | +| [ImportContext](./Import/ImportContext.md) | Shared context passed to all import phases. | +| [ImportErrorReport](./Progress/ImportErrorReport.md) | Comprehensive error report for import operations. | +| [ImportErrorSummary](./Progress/ImportErrorSummary.md) | Summary statistics for an import operation. | +| [ImportExecutionContext](./Progress/ImportExecutionContext.md) | Execution context capturing version and environment information for diagnostics. | +| [ImportOptions](./Import/ImportOptions.md) | Options for import operations. | +| [ImportOutputManager](./Progress/ImportOutputManager.md) | Manages streaming output for import operations. | +| [ImportResult](./Import/ImportResult.md) | Result of an import operation. | +| [ImportTier](./Models/ImportTier.md) | Represents a tier of entities that can be imported in parallel. | +| [ImportWarning](./Progress/ImportWarning.md) | Represents a warning that occurred during import. | +| [ImportWarningCodes](./Progress/ImportWarningCodes.md) | Standard warning codes for import operations. | +| [IncidentHandler](./Import/Handlers/IncidentHandler.md) | Handles state transitions for incident (case) records. | +| [JsonProgressReporter](./Progress/JsonProgressReporter.md) | Progress reporter that writes JSON lines to a TextWriter. | +| [LeadHandler](./Import/Handlers/LeadHandler.md) | Handles state transitions for lead records. | +| [ManyToManyRelationshipData](./Models/ManyToManyRelationshipData.md) | Represents grouped M2M associations for one source record. | +| [MigrationData](./Models/MigrationData.md) | Container for exported migration data. | +| [MigrationError](./Progress/MigrationError.md) | Error information from a migration operation. | +| [MigrationOptions](./DependencyInjection/MigrationOptions.md) | Options for configuring migration services. | +| [MigrationResult](./Progress/MigrationResult.md) | Result of a migration operation. | +| [MigrationSchema](./Models/MigrationSchema.md) | Parsed migration schema containing entity definitions. | +| [OperationClock](./Progress/OperationClock.md) | Provides elapsed time since the current operation started. | +| [OpportunityHandler](./Import/Handlers/OpportunityHandler.md) | Handles state transitions for opportunity records. | +| [ParallelExporter](./Export/ParallelExporter.md) | Parallel exporter for Dataverse data. | +| [PhaseResult](./Import/PhaseResult.md) | Result from a single import phase. | +| [PluginStepManager](./Import/PluginStepManager.md) | Manages plugin step disabling/enabling during import. | +| [PluginStepReenableException](./Import/PluginStepReenableException.md) | Aggregated exception thrown when one or more plugin steps fail to re-enable. | +| [ProductHandler](./Import/Handlers/ProductHandler.md) | Handles product records during import. | +| [ProgressAdapterFactory](./Progress/ProgressAdapterFactory.md) | Creates `System.IProgress`1` adapters that bridge | +| [ProgressEventArgs](./Progress/ProgressEventArgs.md) | Progress event data for migration operations. | +| [QuoteHandler](./Import/Handlers/QuoteHandler.md) | Handles state transitions for quote records. | +| [RelationshipProcessor](./Import/RelationshipProcessor.md) | Processes many-to-many relationships after entity import. | +| [RelationshipSchema](./Models/RelationshipSchema.md) | Schema definition for a relationship. | +| [RetryManifest](./Progress/RetryManifest.md) | Manifest of failed records for retry operations. | +| [SalesOrderHandler](./Import/Handlers/SalesOrderHandler.md) | Handles state transitions for sales order records. | +| [SchemaGeneratorOptions](./Schema/SchemaGeneratorOptions.md) | Options for schema generation. | +| [SchemaMismatchException](./Import/SchemaMismatchException.md) | Exception thrown when exported data contains columns that don't exist in the target environment. | +| [SchemaMismatchResult](./Import/SchemaMismatchResult.md) | Result of schema mismatch detection between exported data and target environment. | +| [SchemaValidator](./Import/SchemaValidator.md) | Validates schema compatibility between exported data and target environment. | +| [ServiceCollectionExtensions](./DependencyInjection/ServiceCollectionExtensions.md) | Extension methods for registering migration services. | +| [StateTransitionCollection](./Import/StateTransitionCollection.md) | Thread-safe collection of state transitions to apply after record import. | +| [StateTransitionData](./Import/StateTransitionData.md) | Describes a state/status transition to apply to a record after import. | +| [StateTransitionProcessor](./Import/StateTransitionProcessor.md) | Processes Phase 3 of the import pipeline: applying state transitions | +| [SystemUserHandler](./Import/Handlers/SystemUserHandler.md) | Filters system, integration, and support users during import. | +| [TieredImporter](./Import/TieredImporter.md) | Tiered importer that respects dependency order. | +| [UserInfo](./UserMapping/UserInfo.md) | Information about a system user. | +| [UserMapping](./Models/UserMapping.md) | Represents a mapping from a source user to a target user. | +| [UserMappingCollection](./Models/UserMappingCollection.md) | Collection of user mappings for migrating user references between environments. | +| [UserMappingGenerator](./UserMapping/UserMappingGenerator.md) | Generates user mapping files for cross-environment migration. | +| [UserMappingMatch](./UserMapping/UserMappingMatch.md) | A matched user mapping. | +| [UserMappingOptions](./UserMapping/UserMappingOptions.md) | Options for user mapping generation. | +| [UserMappingReader](./Formats/UserMappingReader.md) | Reads user mapping files. | +| [UserMappingResult](./UserMapping/UserMappingResult.md) | Result of user mapping generation. | +| [WarningCollector](./Progress/WarningCollector.md) | Thread-safe implementation of `PPDS.Migration.Progress.IWarningCollector`. | + +## Structs + +| Type | Summary | +|------|---------| +| [FieldValidity](./Import/FieldValidity.md) | Represents the create/update validity of a field in the target environment. | +| [GuidRange](./Export/GuidRange.md) | Represents a range of GUIDs for partitioned export queries. | + +## Enums + +| Type | Summary | +|------|---------| +| [BulkOperationType](./Import/BulkOperationType.md) | The type of bulk operation to execute. | +| [DateMode](./Models/DateMode.md) | Determines how date/time fields are adjusted during import. | +| [DependencyType](./Models/DependencyType.md) | Type of dependency between entities. | +| [ImportMode](./Import/ImportMode.md) | Import mode for handling records. | +| [MigrationPhase](./Progress/MigrationPhase.md) | Phase of the migration operation. | + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/ApiBindingType.md b/docs/reference/libraries/docs/reference/libraries/Plugins/ApiBindingType.md new file mode 100644 index 0000000..e881cd4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/ApiBindingType.md @@ -0,0 +1,39 @@ + + +# ApiBindingType + +- Namespace: `PPDS.Plugins` +- Assembly: `PPDS.Plugins` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Specifies the binding type for a Custom API. +Determines whether the API is global or bound to a specific entity or entity collection. + +## Members + +### Fields + +#### Entity + +`ApiBindingType Entity` + +Entity (1). The API is bound to a single entity record. +The API operates on a specific entity instance identified by its ID. + +#### EntityCollection + +`ApiBindingType EntityCollection` + +Entity collection (2). The API is bound to a collection of entity records. +The API operates on multiple entity instances. + +#### Global + +`ApiBindingType Global` + +Global (0). The API is not bound to any specific entity. +Use for operations that are not entity-specific. + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/ApiParameterType.md b/docs/reference/libraries/docs/reference/libraries/Plugins/ApiParameterType.md new file mode 100644 index 0000000..3e848a6 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/ApiParameterType.md @@ -0,0 +1,109 @@ + + +# ApiParameterType + +- Namespace: `PPDS.Plugins` +- Assembly: `PPDS.Plugins` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Specifies the data type of a Custom API request or response parameter. +These values correspond to the Dataverse Custom API parameter types. + +## Members + +### Fields + +#### Boolean + +`ApiParameterType Boolean` + +Boolean (0). A true/false value. +Maps to the Dataverse Boolean type. + +#### DateTime + +`ApiParameterType DateTime` + +DateTime (1). A date and time value. +Maps to the Dataverse DateTime type. + +#### Decimal + +`ApiParameterType Decimal` + +Decimal (2). A high-precision decimal number. +Maps to the Dataverse Decimal type. + +#### Entity + +`ApiParameterType Entity` + +Entity (3). A single entity record. +Maps to the Dataverse Entity type. + +#### EntityCollection + +`ApiParameterType EntityCollection` + +Entity collection (4). A collection of entity records. +Maps to the Dataverse EntityCollection type. + +#### EntityReference + +`ApiParameterType EntityReference` + +Entity reference (5). A reference to a single entity record by logical name and ID. +Maps to the Dataverse EntityReference type. + +#### Float + +`ApiParameterType Float` + +Float (6). A floating-point number. +Maps to the Dataverse Float type. + +#### Guid + +`ApiParameterType Guid` + +Guid (12). A globally unique identifier. +Maps to the Dataverse Guid type. + +#### Integer + +`ApiParameterType Integer` + +Integer (7). A whole number. +Maps to the Dataverse Integer type. + +#### Money + +`ApiParameterType Money` + +Money (8). A monetary value with currency information. +Maps to the Dataverse Money type. + +#### Picklist + +`ApiParameterType Picklist` + +Picklist (9). An option set value. +Maps to the Dataverse OptionSetValue type. + +#### String + +`ApiParameterType String` + +String (10). A text value. +Maps to the Dataverse String type. + +#### StringArray + +`ApiParameterType StringArray` + +String array (11). A collection of text values. +Maps to the Dataverse StringArray type. + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/ApiProcessingStepType.md b/docs/reference/libraries/docs/reference/libraries/Plugins/ApiProcessingStepType.md new file mode 100644 index 0000000..a1dff6d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/ApiProcessingStepType.md @@ -0,0 +1,39 @@ + + +# ApiProcessingStepType + +- Namespace: `PPDS.Plugins` +- Assembly: `PPDS.Plugins` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Specifies the type of processing steps allowed for a Custom API. +Controls whether synchronous and/or asynchronous processing steps can be registered. + +## Members + +### Fields + +#### AsyncOnly + +`ApiProcessingStepType AsyncOnly` + +Async only (1). Only asynchronous processing steps are allowed. +Use when additional processing must not block the caller. + +#### None + +`ApiProcessingStepType None` + +None (0). No custom processing steps are allowed for this API. +Use when the Custom API handler plugin is sufficient and no additional steps are needed. + +#### SyncAndAsync + +`ApiProcessingStepType SyncAndAsync` + +Sync and async (2). Both synchronous and asynchronous processing steps are allowed. +Use when additional processing may need to run before the response is returned. + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/CustomApiAttribute.md b/docs/reference/libraries/docs/reference/libraries/Plugins/CustomApiAttribute.md new file mode 100644 index 0000000..6b388fa --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/CustomApiAttribute.md @@ -0,0 +1,103 @@ + + +# CustomApiAttribute + +- Namespace: `PPDS.Plugins` +- Assembly: `PPDS.Plugins` +- Kind: Class +- Base: `Attribute` + +## Summary + +Defines Custom API registration configuration. +Apply to plugin classes to specify how the Custom API should be registered in Dataverse. +Only one Custom API can be defined per class. + +## Members + +### Constructors + +#### CustomApiAttribute() + +`CustomApiAttribute()` + +Initializes a new instance of the CustomApiAttribute class. + + +### Properties + +#### AllowedProcessingStepType + +`ApiProcessingStepType AllowedProcessingStepType { get; set; }` + +Gets or sets the type of processing steps allowed for this Custom API. +Controls whether synchronous and/or asynchronous plug-in steps can be registered. +Default: None. + +#### BindingType + +`ApiBindingType BindingType { get; set; }` + +Gets or sets the binding type that determines whether the API is global, +entity-bound, or entity-collection-bound. +Default: Global. + +#### BoundEntity + +`string BoundEntity { get; set; }` + +Gets or sets the logical name of the entity this API is bound to. +Only applicable when BindingType is Entity or EntityCollection. + +#### Description + +`string Description { get; set; }` + +Gets or sets a description of what this Custom API does. +Stored as metadata in Dataverse and displayed in the UI. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the display name of the Custom API shown in the Dataverse UI. +Required. + +#### ExecutePrivilegeName + +`string ExecutePrivilegeName { get; set; }` + +Gets or sets the name of the privilege required to execute this Custom API. +If specified, only users with this privilege can invoke the API. + +#### IsFunction + +`bool IsFunction { get; set; }` + +Gets or sets whether this Custom API is a function (returns a value without side effects) +or an action (may have side effects). +Default: false (action). + +#### IsPrivate + +`bool IsPrivate { get; set; }` + +Gets or sets whether this Custom API is private. +Private APIs are not visible in the Web API $metadata document. +Default: false. + +#### Name + +`string Name { get; set; }` + +Gets or sets the logical name of the Custom API. +If not specified, the UniqueName is used. + +#### UniqueName + +`string UniqueName { get; set; }` + +Gets or sets the unique name of the Custom API. +Must include a publisher prefix (e.g., "ppds_MyCustomApi"). +Required. + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/CustomApiParameterAttribute.md b/docs/reference/libraries/docs/reference/libraries/Plugins/CustomApiParameterAttribute.md new file mode 100644 index 0000000..8687a19 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/CustomApiParameterAttribute.md @@ -0,0 +1,85 @@ + + +# CustomApiParameterAttribute + +- Namespace: `PPDS.Plugins` +- Assembly: `PPDS.Plugins` +- Kind: Class +- Base: `Attribute` + +## Summary + +Defines a request or response parameter for a Custom API. +Apply multiple times to a plugin class to define all input and output parameters. +Must be used together with `PPDS.Plugins.CustomApiAttribute`. + +## Members + +### Constructors + +#### CustomApiParameterAttribute() + +`CustomApiParameterAttribute()` + +Initializes a new instance of the CustomApiParameterAttribute class. + + +### Properties + +#### Description + +`string Description { get; set; }` + +Gets or sets a description of the parameter. +Stored as metadata in Dataverse. + +#### Direction + +`ParameterDirection Direction { get; set; }` + +Gets or sets whether this is an input (request) or output (response) parameter. +Default: Input. + +#### DisplayName + +`string DisplayName { get; set; }` + +Gets or sets the display name of the parameter shown in the Dataverse UI. +If not specified, the Name is used. + +#### IsOptional + +`bool IsOptional { get; set; }` + +Gets or sets whether the parameter is optional. +Optional parameters do not need to be provided when invoking the API. +Default: false (required). + +#### LogicalEntityName + +`string LogicalEntityName { get; set; }` + +Gets or sets the logical name of the entity for EntityReference parameters. +Required when Type is EntityReference, Entity, or EntityCollection. + +#### Name + +`string Name { get; set; }` + +Gets or sets the logical name of the parameter used in code. +Required. + +#### Type + +`ApiParameterType Type { get; set; }` + +Gets or sets the data type of the parameter. +Required. + +#### UniqueName + +`string UniqueName { get; set; }` + +Gets or sets the unique name of the parameter including the publisher prefix. +If not specified, the Name is used. + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/ParameterDirection.md b/docs/reference/libraries/docs/reference/libraries/Plugins/ParameterDirection.md new file mode 100644 index 0000000..226802e --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/ParameterDirection.md @@ -0,0 +1,31 @@ + + +# ParameterDirection + +- Namespace: `PPDS.Plugins` +- Assembly: `PPDS.Plugins` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Specifies whether a Custom API parameter is an input or output parameter. + +## Members + +### Fields + +#### Input + +`ParameterDirection Input` + +Input (0). The parameter is a request parameter passed into the Custom API. +Use for values that the caller provides when invoking the API. + +#### Output + +`ParameterDirection Output` + +Output (1). The parameter is a response parameter returned from the Custom API. +Use for values that the API returns to the caller. + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/PluginDeployment.md b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginDeployment.md new file mode 100644 index 0000000..723d320 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginDeployment.md @@ -0,0 +1,38 @@ + + +# PluginDeployment + +- Namespace: `PPDS.Plugins` +- Assembly: `PPDS.Plugins` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Specifies the deployment context in which a plugin step executes. + +## Members + +### Fields + +#### Both + +`PluginDeployment Both` + +Both server and offline (2). Plugin executes in both contexts. +Use when the same logic must run online and offline. + +#### Offline + +`PluginDeployment Offline` + +Offline only (1). Plugin executes only in the offline client. +Use for operations that must run in disconnected scenarios. + +#### ServerOnly + +`PluginDeployment ServerOnly` + +Server only (0). Plugin executes only on the Dataverse server. +Use for most server-side operations. + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/PluginImageAttribute.md b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginImageAttribute.md new file mode 100644 index 0000000..3f84fa1 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginImageAttribute.md @@ -0,0 +1,101 @@ + + +# PluginImageAttribute + +- Namespace: `PPDS.Plugins` +- Assembly: `PPDS.Plugins` +- Kind: Class +- Base: `Attribute` + +## Summary + +Defines a pre-image or post-image for a plugin step. +Images provide access to entity data before or after the operation. + +## Members + +### Constructors + +#### PluginImageAttribute() + +`PluginImageAttribute()` + +Initializes a new instance of the PluginImageAttribute class. + +#### PluginImageAttribute(PluginImageType imageType, string name) + +`PluginImageAttribute(PluginImageType imageType, string name)` + +Initializes a new instance of the PluginImageAttribute class with required parameters. + +- Param `imageType`: The type of image + +- Param `name`: The name to access the image in code + +#### PluginImageAttribute(PluginImageType imageType, string name, string attributes) + +`PluginImageAttribute(PluginImageType imageType, string name, string attributes)` + +Initializes a new instance of the PluginImageAttribute class with all common parameters. + +- Param `imageType`: The type of image + +- Param `name`: The name to access the image in code + +- Param `attributes`: Comma-separated attributes to include + + +### Properties + +#### Attributes + +`string Attributes { get; set; }` + +Gets or sets the comma-separated list of attributes to include in the image. +If empty, all attributes are included (not recommended for performance). + +#### Description + +`string Description { get; set; }` + +Gets or sets a description of this image's purpose. +Stored as metadata in Dataverse. + +#### EntityAlias + +`string EntityAlias { get; set; }` + +Gets or sets the entity alias for the image. +Defaults to the Name if not specified. + +#### ImageType + +`PluginImageType ImageType { get; set; }` + +Gets or sets the type of image (PreImage, PostImage, or Both). +Required. + +#### MessagePropertyName + +`string MessagePropertyName { get; set; }` + +Gets or sets the message property name that carries the entity. +If null, auto-inferred from the message name (e.g., "Target" for Create/Update). +Override for non-standard messages. + +#### Name + +`string Name { get; set; }` + +Gets or sets the name used to access the image in the plugin context. +This is the key used in PreEntityImages or PostEntityImages collections. +Required. + +#### StepId + +`string StepId { get; set; }` + +Gets or sets the StepId to associate this image with a specific step. +Only needed when the plugin has multiple steps registered. +Must match the StepId property of a PluginStepAttribute on the same class. + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/PluginImageType.md b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginImageType.md new file mode 100644 index 0000000..3c92aa2 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginImageType.md @@ -0,0 +1,38 @@ + + +# PluginImageType + +- Namespace: `PPDS.Plugins` +- Assembly: `PPDS.Plugins` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Specifies the type of entity image to register with a plugin step. + +## Members + +### Fields + +#### Both + +`PluginImageType Both` + +Both pre and post images (2). +Only available in Post-operation stage. + +#### PostImage + +`PluginImageType PostImage` + +Post-image (1). Snapshot of the entity after the operation. +Only available in Post-operation stage. + +#### PreImage + +`PluginImageType PreImage` + +Pre-image (0). Snapshot of the entity before the operation. +Available in Pre-operation and Post-operation stages. + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/PluginInvocationSource.md b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginInvocationSource.md new file mode 100644 index 0000000..c5ad722 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginInvocationSource.md @@ -0,0 +1,31 @@ + + +# PluginInvocationSource + +- Namespace: `PPDS.Plugins` +- Assembly: `PPDS.Plugins` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Specifies the invocation source for a plugin step. + +## Members + +### Fields + +#### Child + +`PluginInvocationSource Child` + +Child pipeline (1). Plugin is invoked from a child execution context. +Use to restrict execution to nested/child operations only. + +#### Parent + +`PluginInvocationSource Parent` + +Parent pipeline (0). Plugin is invoked from the parent execution context. +Use to restrict execution to the top-level pipeline only. + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/PluginMode.md b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginMode.md new file mode 100644 index 0000000..de51e05 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginMode.md @@ -0,0 +1,31 @@ + + +# PluginMode + +- Namespace: `PPDS.Plugins` +- Assembly: `PPDS.Plugins` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Specifies the execution mode for a plugin step. + +## Members + +### Fields + +#### Asynchronous + +`PluginMode Asynchronous` + +Asynchronous execution (1). Plugin executes in the background via the async service. +Use for non-critical operations like logging, notifications, or external integrations. + +#### Synchronous + +`PluginMode Synchronous` + +Synchronous execution (0). Plugin executes immediately and blocks the operation. +Use for validation, data modification, or when immediate feedback is required. + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/PluginStage.md b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginStage.md new file mode 100644 index 0000000..27f68c4 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginStage.md @@ -0,0 +1,38 @@ + + +# PluginStage + +- Namespace: `PPDS.Plugins` +- Assembly: `PPDS.Plugins` +- Kind: Enum +- Implements: `IComparable`, `IConvertible`, `IFormattable`, `ISpanFormattable` + +## Summary + +Specifies the stage in the event pipeline when a plugin executes. + +## Members + +### Fields + +#### PostOperation + +`PluginStage PostOperation` + +Post-operation stage (40). Executes after the main operation. +Use for actions that depend on the committed data. + +#### PreOperation + +`PluginStage PreOperation` + +Pre-operation stage (20). Executes before the main operation. +Use for modifying data before it's written to the database. + +#### PreValidation + +`PluginStage PreValidation` + +Pre-validation stage (10). Executes before main system validation. +Use for validation that should occur before any database locks. + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/PluginStepAttribute.md b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginStepAttribute.md new file mode 100644 index 0000000..72dbda3 --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/PluginStepAttribute.md @@ -0,0 +1,164 @@ + + +# PluginStepAttribute + +- Namespace: `PPDS.Plugins` +- Assembly: `PPDS.Plugins` +- Kind: Class +- Base: `Attribute` + +## Summary + +Defines plugin step registration configuration. +Apply to plugin classes to specify how the plugin should be registered in Dataverse. +Multiple attributes can be applied for plugins that handle multiple messages/entities. + +## Members + +### Constructors + +#### PluginStepAttribute() + +`PluginStepAttribute()` + +Initializes a new instance of the PluginStepAttribute class. + +#### PluginStepAttribute(string message, string entityLogicalName, PluginStage stage) + +`PluginStepAttribute(string message, string entityLogicalName, PluginStage stage)` + +Initializes a new instance of the PluginStepAttribute class with required parameters. + +- Param `message`: The SDK message name (Create, Update, Delete, etc.) + +- Param `entityLogicalName`: The entity logical name + +- Param `stage`: The pipeline stage + + +### Properties + +#### AsyncAutoDelete + +`bool AsyncAutoDelete { get; set; }` + +Gets or sets whether to automatically delete the async job on successful completion. +Only applies when Mode is Asynchronous. Default is false (keep async job records). +Set to true to clean up async job records after successful execution. + +#### CanBeBypassed + +`bool CanBeBypassed { get; set; }` + +Gets or sets whether this step can be bypassed via BypassBusinessLogicExecution. +Default: true (matches Dataverse default). + +#### CanUseReadOnlyConnection + +`bool CanUseReadOnlyConnection { get; set; }` + +Gets or sets whether this step can use a read-only database connection. +Set to true for steps that only read data, for improved performance. +Default: false. + +#### Deployment + +`PluginDeployment Deployment { get; set; }` + +Gets or sets the deployment target. +Default: ServerOnly. + +#### Description + +`string Description { get; set; }` + +Gets or sets a description of what this plugin step does. +This is stored as metadata in Dataverse and helps document the step's purpose. + +#### EntityLogicalName + +`string EntityLogicalName { get; set; }` + +Gets or sets the logical name of the primary entity this step applies to. +Use "none" for messages that don't require an entity (e.g., WhoAmI). +Required. + +#### ExecutionOrder + +`int ExecutionOrder { get; set; }` + +Gets or sets the execution order when multiple plugins are registered for the same event. +Lower numbers execute first. Must be between 1 and 999999. Default: 1. + +#### FilteringAttributes + +`string FilteringAttributes { get; set; }` + +Gets or sets the comma-separated list of attributes that trigger this plugin. +Only applicable for Update message. If empty, triggers on any attribute change. + +#### InvocationSource + +`PluginInvocationSource InvocationSource { get; set; }` + +Gets or sets the pipeline invocation source. +Parent executes in the parent pipeline, Child in child pipelines only. +Default: Parent. + +#### Message + +`string Message { get; set; }` + +Gets or sets the SDK message name (e.g., Create, Update, Delete, Retrieve, RetrieveMultiple). +Required. + +#### Mode + +`PluginMode Mode { get; set; }` + +Gets or sets the execution mode (synchronous or asynchronous). +Default: Synchronous. + +#### Name + +`string Name { get; set; }` + +Gets or sets the display name for the step. +If not specified, auto-generated as "{PluginTypeName}: {Message} of {Entity}". + +#### RunAsUser + +`string RunAsUser { get; set; }` + +Gets or sets the impersonation user for step execution. +Values: null (calling user), "CallingUser", "System", a GUID, email, or domain name. + +#### SecondaryEntityLogicalName + +`string SecondaryEntityLogicalName { get; set; }` + +Gets or sets the logical name of the secondary entity for relationship-based messages. +Used with Associate, Disassociate, and SetRelated messages where two entity types are involved. + +#### Stage + +`PluginStage Stage { get; set; }` + +Gets or sets the pipeline stage when this plugin executes. +Required. + +#### StepId + +`string StepId { get; set; }` + +Gets or sets a unique identifier for this step when a plugin has multiple steps. +Used to associate PluginImageAttribute with a specific step. + +#### UnsecureConfiguration + +`string UnsecureConfiguration { get; set; }` + +Gets or sets the unsecure configuration string passed to the plugin constructor. +This configuration is stored in plain text and is visible to users with appropriate read access +to the plugin step entity, as determined by their security roles and privileges in Dataverse. + diff --git a/docs/reference/libraries/docs/reference/libraries/Plugins/_index.md b/docs/reference/libraries/docs/reference/libraries/Plugins/_index.md new file mode 100644 index 0000000..bbe083d --- /dev/null +++ b/docs/reference/libraries/docs/reference/libraries/Plugins/_index.md @@ -0,0 +1,27 @@ + + +# Plugins reference + +## Classes + +| Type | Summary | +|------|---------| +| [CustomApiAttribute](./CustomApiAttribute.md) | Defines Custom API registration configuration. | +| [CustomApiParameterAttribute](./CustomApiParameterAttribute.md) | Defines a request or response parameter for a Custom API. | +| [PluginImageAttribute](./PluginImageAttribute.md) | Defines a pre-image or post-image for a plugin step. | +| [PluginStepAttribute](./PluginStepAttribute.md) | Defines plugin step registration configuration. | + +## Enums + +| Type | Summary | +|------|---------| +| [ApiBindingType](./ApiBindingType.md) | Specifies the binding type for a Custom API. | +| [ApiParameterType](./ApiParameterType.md) | Specifies the data type of a Custom API request or response parameter. | +| [ApiProcessingStepType](./ApiProcessingStepType.md) | Specifies the type of processing steps allowed for a Custom API. | +| [ParameterDirection](./ParameterDirection.md) | Specifies whether a Custom API parameter is an input or output parameter. | +| [PluginDeployment](./PluginDeployment.md) | Specifies the deployment context in which a plugin step executes. | +| [PluginImageType](./PluginImageType.md) | Specifies the type of entity image to register with a plugin step. | +| [PluginInvocationSource](./PluginInvocationSource.md) | Specifies the invocation source for a plugin step. | +| [PluginMode](./PluginMode.md) | Specifies the execution mode for a plugin step. | +| [PluginStage](./PluginStage.md) | Specifies the stage in the event pipeline when a plugin executes. | + diff --git a/docs/reference/mcp/_index.md b/docs/reference/mcp/_index.md new file mode 100644 index 0000000..571f2ba --- /dev/null +++ b/docs/reference/mcp/_index.md @@ -0,0 +1,105 @@ + + +# MCP Tools + +## auth + +| Tool | Description | +|------|-------------| +| [ppds_auth_who](./tools/ppds_auth_who.md) | Get the current authentication profile context including identity, connected environment, and token status. Use this to understand which Dataverse environment queries will run against. | + +## connectionreferences + +| Tool | Description | +|------|-------------| +| [ppds_connection_references_analyze](./tools/ppds_connection_references_analyze.md) | Analyze connection references for orphaned references (not used by any flow) and orphaned flows (referencing missing connection references). Useful for deployment cleanup. | +| [ppds_connection_references_get](./tools/ppds_connection_references_get.md) | Get full details of a specific connection reference including dependent flows and connection info. Use the logicalName from ppds_connection_references_list. | +| [ppds_connection_references_list](./tools/ppds_connection_references_list.md) | List connection references in the current environment. Shows connector bindings and whether connections are bound. Optionally filter by solution name. | + +## customapis + +| Tool | Description | +|------|-------------| +| [ppds_custom_apis_list](./tools/ppds_custom_apis_list.md) | List all Custom APIs registered in the Dataverse environment. Custom APIs are developer-defined messages that extend the Dataverse API surface with custom business logic. Returns each API with its request parameters and response properties. | + +## data + +| Tool | Description | +|------|-------------| +| [ppds_data_analyze](./tools/ppds_data_analyze.md) | Analyze data for a Dataverse entity. Returns record count, primary attributes, and sample records. Use this to understand the data in an entity before querying. | +| [ppds_data_providers_list](./tools/ppds_data_providers_list.md) | List all virtual entity data sources and data providers registered in the Dataverse environment. Data providers implement plugin-based virtual entity adapters that connect Dataverse virtual entities to external data sources. Returns both data source definitions and their associated data provider plugin bindings. | +| [ppds_data_schema](./tools/ppds_data_schema.md) | Get the schema (fields/attributes) for a Dataverse entity. Returns attribute names, types, and metadata. Use this to understand entity structure before querying. | + +## env + +| Tool | Description | +|------|-------------| +| [ppds_env_list](./tools/ppds_env_list.md) | List available Dataverse environments. Use this to discover which environments are accessible with the current authentication profile. The currently selected environment is marked with isActive=true. | +| [ppds_env_select](./tools/ppds_env_select.md) | Select a Dataverse environment for subsequent queries. You can specify the environment by URL (e.g., 'https://contoso.crm.dynamics.com'), display name (e.g., 'Contoso Production'), or unique name. All subsequent ppds tools will use this environment. | +| [ppds_environment_variables_get](./tools/ppds_environment_variables_get.md) | Get full details of a specific environment variable including description, type, and values. Use the schemaName from ppds_environment_variables_list. | +| [ppds_environment_variables_list](./tools/ppds_environment_variables_list.md) | List environment variable definitions and their current values. Shows default vs current values, type, and override status. Optionally filter by solution name. | +| [ppds_environment_variables_set](./tools/ppds_environment_variables_set.md) | Set the current value of an environment variable. Creates the value record if none exists. AI agents can use this to fix misconfigurations during deployment troubleshooting. | + +## importjobs + +| Tool | Description | +|------|-------------| +| [ppds_import_jobs_get](./tools/ppds_import_jobs_get.md) | Get full details of a specific import job including the XML import log. Use the id from ppds_import_jobs_list. The import log XML contains detailed component-level success/failure information for troubleshooting failed imports. | +| [ppds_import_jobs_list](./tools/ppds_import_jobs_list.md) | List recent solution import jobs for the current environment. Shows import status, progress, solution name, and timing. Use this to check if a solution import succeeded or failed. | + +## metadata + +| Tool | Description | +|------|-------------| +| [ppds_metadata_add_column](./tools/ppds_metadata_add_column.md) | Adds a new column (attribute) to an existing Dataverse table. Supports all standard column types. Use dry-run to validate before committing. | +| [ppds_metadata_add_option_value](./tools/ppds_metadata_add_option_value.md) | Adds a new option value to an existing option set (global or local choice). Returns the assigned integer value. | +| [ppds_metadata_create_choice](./tools/ppds_metadata_create_choice.md) | Creates a new global choice (option set) in the specified solution. Options are provided as a JSON array of {label, value} objects. Supports dry-run mode. | +| [ppds_metadata_create_key](./tools/ppds_metadata_create_key.md) | Creates an alternate key on a Dataverse table. Attributes can be provided as a comma-separated list or a JSON array of column logical names. Supports dry-run mode. | +| [ppds_metadata_create_relationship](./tools/ppds_metadata_create_relationship.md) | Creates a relationship (one-to-many or many-to-many) between two Dataverse tables. For one-to-many, a lookup column is created on the referencing entity. Supports dry-run mode. | +| [ppds_metadata_create_table](./tools/ppds_metadata_create_table.md) | Creates a new Dataverse table (entity) in the specified solution. Supports dry-run mode for validation without persisting changes. Use ppds_metadata_entities to verify the table was created. | +| [ppds_metadata_entities](./tools/ppds_metadata_entities.md) | Lists all entities (tables) in the connected Dataverse environment. Returns entity logical names, display names, schema names, and ownership type. Use this to discover available entities before querying with ppds_metadata_entity for full details. | +| [ppds_metadata_entity](./tools/ppds_metadata_entity.md) | Get detailed metadata for a Dataverse entity including attributes, relationships, and keys. Use this to understand entity structure, field types, and how entities relate to each other. | +| [ppds_metadata_update_choice](./tools/ppds_metadata_update_choice.md) | Updates an existing global choice (option set). Only the provided optional fields are changed; omitted fields remain unchanged. Supports dry-run mode. | +| [ppds_metadata_update_column](./tools/ppds_metadata_update_column.md) | Updates an existing column (attribute) on a Dataverse table. Only the provided optional fields are changed; omitted fields remain unchanged. Supports dry-run mode. | +| [ppds_metadata_update_relationship](./tools/ppds_metadata_update_relationship.md) | Updates an existing Dataverse relationship's cascade configuration. Only the provided optional fields are changed; omitted fields remain unchanged. Supports dry-run mode. | +| [ppds_metadata_update_table](./tools/ppds_metadata_update_table.md) | Updates an existing Dataverse table (entity). Only the provided optional fields are changed; omitted fields remain unchanged. Supports dry-run mode. | + +## plugin + +| Tool | Description | +|------|-------------| +| [ppds_plugin_traces_delete](./tools/ppds_plugin_traces_delete.md) | Delete plugin trace logs. Provide exactly one mode: specific IDs for targeted deletion, olderThanDays for age-based cleanup, or filter parameters (typeName, messageName, primaryEntity, errorsOnly) for criteria-based deletion. | +| [ppds_plugin_traces_get](./tools/ppds_plugin_traces_get.md) | Get detailed information about a specific plugin trace including the full message block (trace output) and exception details. Use the trace ID from ppds_plugin_traces_list. | +| [ppds_plugin_traces_list](./tools/ppds_plugin_traces_list.md) | List plugin trace logs from Dataverse. Use this to find plugin execution logs, identify errors, and debug plugin behavior. Requires trace logging to be enabled in the environment. | +| [ppds_plugin_traces_timeline](./tools/ppds_plugin_traces_timeline.md) | Build an execution timeline showing all plugin executions for a single transaction. Use the correlationId from ppds_plugin_traces_list to see how plugins chain together and identify performance bottlenecks. | +| [ppds_plugins_get](./tools/ppds_plugins_get.md) | Get detailed information for a specific plugin registration entity (assembly, package, type, step, or image). Use ppds_plugins_list first to discover entity names/IDs. | +| [ppds_plugins_list](./tools/ppds_plugins_list.md) | List registered plugin assemblies in the Dataverse environment. Shows plugin types and their registered steps (message/entity/stage combinations). By default excludes hidden system assemblies and Microsoft.* assemblies. | + +## query + +| Tool | Description | +|------|-------------| +| [ppds_query_fetch](./tools/ppds_query_fetch.md) | Execute a FetchXML query against Dataverse. Use this when you have raw FetchXML or need advanced query features not available in SQL. Prefer ppds_query_sql for simpler queries. | +| [ppds_query_sql](./tools/ppds_query_sql.md) | Execute a SQL SELECT query against Dataverse. The SQL is transpiled to FetchXML internally. Supports JOINs, WHERE, ORDER BY, TOP, and aggregate functions. Example: SELECT name, revenue FROM account WHERE statecode = 0 ORDER BY revenue DESC | + +## serviceendpoints + +| Tool | Description | +|------|-------------| +| [ppds_service_endpoints_list](./tools/ppds_service_endpoints_list.md) | List all service endpoints and webhooks registered in the Dataverse environment. Includes Azure Service Bus (Queue, Topic, EventHub), REST endpoints, and HTTP webhooks. Used for event-driven integrations that receive Dataverse change notifications. | + +## solutions + +| Tool | Description | +|------|-------------| +| [ppds_solutions_components](./tools/ppds_solutions_components.md) | Get components of a Dataverse solution. Returns entities, workflows, plugins, and other components. Use the solution id from ppds_solutions_list. Optionally filter by component type code. | +| [ppds_solutions_list](./tools/ppds_solutions_list.md) | List Dataverse solutions for the current environment. Shows solution name, version, publisher, and managed status. Use includeManaged to also show managed (system) solutions. | + +## webresources + +| Tool | Description | +|------|-------------| +| [ppds_web_resources_get](./tools/ppds_web_resources_get.md) | Get web resource content for viewing or analysis. Returns decoded text content for text types (JS, HTML, CSS, XML, etc.) and metadata-only for binary types (PNG, JPG, GIF). Use the id from ppds_web_resources_list. | +| [ppds_web_resources_list](./tools/ppds_web_resources_list.md) | List web resources in a Dataverse environment, optionally filtered by solution. Returns name, type, managed status, and modification info. Use textOnly=true (default) to exclude binary types like images. Supports pagination via maxRows and nextPageToken parameters — when more records exist the response includes a nextPageToken to pass on the next call. | +| [ppds_web_resources_publish](./tools/ppds_web_resources_publish.md) | Publish specific web resources to make changes live. After updating web resource content, you must publish for changes to take effect. Provide one or more web resource IDs. | + diff --git a/docs/reference/mcp/tools/ppds_auth_who.md b/docs/reference/mcp/tools/ppds_auth_who.md new file mode 100644 index 0000000..0d02b7d --- /dev/null +++ b/docs/reference/mcp/tools/ppds_auth_who.md @@ -0,0 +1,14 @@ + + +# ppds_auth_who + +Get the current authentication profile context including identity, connected environment, and token status. Use this to understand which Dataverse environment queries will run against. + +## Input schema + +_No parameters._ + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_connection_references_analyze.md b/docs/reference/mcp/tools/ppds_connection_references_analyze.md new file mode 100644 index 0000000..c376dd1 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_connection_references_analyze.md @@ -0,0 +1,14 @@ + + +# ppds_connection_references_analyze + +Analyze connection references for orphaned references (not used by any flow) and orphaned flows (referencing missing connection references). Useful for deployment cleanup. + +## Input schema + +_No parameters._ + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_connection_references_get.md b/docs/reference/mcp/tools/ppds_connection_references_get.md new file mode 100644 index 0000000..adbcff8 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_connection_references_get.md @@ -0,0 +1,16 @@ + + +# ppds_connection_references_get + +Get full details of a specific connection reference including dependent flows and connection info. Use the logicalName from ppds_connection_references_list. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| logicalName | `String` | yes | Logical name of the connection reference | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_connection_references_list.md b/docs/reference/mcp/tools/ppds_connection_references_list.md new file mode 100644 index 0000000..009723d --- /dev/null +++ b/docs/reference/mcp/tools/ppds_connection_references_list.md @@ -0,0 +1,16 @@ + + +# ppds_connection_references_list + +List connection references in the current environment. Shows connector bindings and whether connections are bound. Optionally filter by solution name. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solutionId | `String` | no | Solution unique name to filter by | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_custom_apis_list.md b/docs/reference/mcp/tools/ppds_custom_apis_list.md new file mode 100644 index 0000000..88b008c --- /dev/null +++ b/docs/reference/mcp/tools/ppds_custom_apis_list.md @@ -0,0 +1,14 @@ + + +# ppds_custom_apis_list + +List all Custom APIs registered in the Dataverse environment. Custom APIs are developer-defined messages that extend the Dataverse API surface with custom business logic. Returns each API with its request parameters and response properties. + +## Input schema + +_No parameters._ + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_data_analyze.md b/docs/reference/mcp/tools/ppds_data_analyze.md new file mode 100644 index 0000000..6a1438b --- /dev/null +++ b/docs/reference/mcp/tools/ppds_data_analyze.md @@ -0,0 +1,16 @@ + + +# ppds_data_analyze + +Analyze data for a Dataverse entity. Returns record count, primary attributes, and sample records. Use this to understand the data in an entity before querying. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| entityName | `String` | yes | Entity logical name (e.g., 'account', 'contact') | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_data_providers_list.md b/docs/reference/mcp/tools/ppds_data_providers_list.md new file mode 100644 index 0000000..b8bb274 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_data_providers_list.md @@ -0,0 +1,14 @@ + + +# ppds_data_providers_list + +List all virtual entity data sources and data providers registered in the Dataverse environment. Data providers implement plugin-based virtual entity adapters that connect Dataverse virtual entities to external data sources. Returns both data source definitions and their associated data provider plugin bindings. + +## Input schema + +_No parameters._ + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_data_schema.md b/docs/reference/mcp/tools/ppds_data_schema.md new file mode 100644 index 0000000..03c401c --- /dev/null +++ b/docs/reference/mcp/tools/ppds_data_schema.md @@ -0,0 +1,16 @@ + + +# ppds_data_schema + +Get the schema (fields/attributes) for a Dataverse entity. Returns attribute names, types, and metadata. Use this to understand entity structure before querying. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| entityName | `String` | yes | Entity logical name (e.g., 'account', 'contact', 'opportunity') | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_env_list.md b/docs/reference/mcp/tools/ppds_env_list.md new file mode 100644 index 0000000..04bc840 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_env_list.md @@ -0,0 +1,16 @@ + + +# ppds_env_list + +List available Dataverse environments. Use this to discover which environments are accessible with the current authentication profile. The currently selected environment is marked with isActive=true. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| filter | `String` | no | Optional filter to search environments by name, URL, or ID | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_env_select.md b/docs/reference/mcp/tools/ppds_env_select.md new file mode 100644 index 0000000..4572005 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_env_select.md @@ -0,0 +1,16 @@ + + +# ppds_env_select + +Select a Dataverse environment for subsequent queries. You can specify the environment by URL (e.g., 'https://contoso.crm.dynamics.com'), display name (e.g., 'Contoso Production'), or unique name. All subsequent ppds tools will use this environment. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| environment | `String` | yes | Environment URL, display name, or unique name | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_environment_variables_get.md b/docs/reference/mcp/tools/ppds_environment_variables_get.md new file mode 100644 index 0000000..c08a618 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_environment_variables_get.md @@ -0,0 +1,16 @@ + + +# ppds_environment_variables_get + +Get full details of a specific environment variable including description, type, and values. Use the schemaName from ppds_environment_variables_list. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| schemaName | `String` | yes | Schema name of the environment variable | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_environment_variables_list.md b/docs/reference/mcp/tools/ppds_environment_variables_list.md new file mode 100644 index 0000000..57b4f41 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_environment_variables_list.md @@ -0,0 +1,16 @@ + + +# ppds_environment_variables_list + +List environment variable definitions and their current values. Shows default vs current values, type, and override status. Optionally filter by solution name. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solutionId | `String` | no | Solution unique name to filter by | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_environment_variables_set.md b/docs/reference/mcp/tools/ppds_environment_variables_set.md new file mode 100644 index 0000000..8403408 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_environment_variables_set.md @@ -0,0 +1,17 @@ + + +# ppds_environment_variables_set + +Set the current value of an environment variable. Creates the value record if none exists. AI agents can use this to fix misconfigurations during deployment troubleshooting. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| schemaName | `String` | yes | Schema name of the environment variable | +| value | `String` | yes | New value to set | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_import_jobs_get.md b/docs/reference/mcp/tools/ppds_import_jobs_get.md new file mode 100644 index 0000000..7d854e9 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_import_jobs_get.md @@ -0,0 +1,16 @@ + + +# ppds_import_jobs_get + +Get full details of a specific import job including the XML import log. Use the id from ppds_import_jobs_list. The import log XML contains detailed component-level success/failure information for troubleshooting failed imports. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| id | `String` | yes | The import job ID (GUID) from ppds_import_jobs_list | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_import_jobs_list.md b/docs/reference/mcp/tools/ppds_import_jobs_list.md new file mode 100644 index 0000000..40f49b8 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_import_jobs_list.md @@ -0,0 +1,14 @@ + + +# ppds_import_jobs_list + +List recent solution import jobs for the current environment. Shows import status, progress, solution name, and timing. Use this to check if a solution import succeeded or failed. + +## Input schema + +_No parameters._ + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_metadata_add_column.md b/docs/reference/mcp/tools/ppds_metadata_add_column.md new file mode 100644 index 0000000..19125be --- /dev/null +++ b/docs/reference/mcp/tools/ppds_metadata_add_column.md @@ -0,0 +1,27 @@ + + +# ppds_metadata_add_column + +Adds a new column (attribute) to an existing Dataverse table. Supports all standard column types. Use dry-run to validate before committing. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solution | `String` | yes | Unique name of the solution containing the table. | +| entityName | `String` | yes | Logical name of the entity to add the column to. | +| schemaName | `String` | yes | Schema name for the new column. | +| displayName | `String` | yes | Display name of the column. | +| type | `String` | yes | Column type: String, Integer, Decimal, Double, Money, Boolean, DateTime, Choice, Choices, Memo, BigInt, Image, File, Lookup. | +| description | `String` | no | Description of the column (optional). | +| maxLength | `Nullable` | no | Maximum length for String/Memo columns (optional). | +| minValue | `Nullable` | no | Minimum value for numeric columns (optional). | +| maxValue | `Nullable` | no | Maximum value for numeric columns (optional). | +| precision | `Nullable` | no | Precision for Decimal, Double, and Money columns (optional). | +| format | `String` | no | Format for String, Integer, or DateTime columns (optional). | +| dryRun | `Boolean` | no | If true, validates without persisting changes. | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_metadata_add_option_value.md b/docs/reference/mcp/tools/ppds_metadata_add_option_value.md new file mode 100644 index 0000000..2f72272 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_metadata_add_option_value.md @@ -0,0 +1,21 @@ + + +# ppds_metadata_add_option_value + +Adds a new option value to an existing option set (global or local choice). Returns the assigned integer value. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solution | `String` | yes | Unique name of the solution containing the option set. | +| optionSetName | `String` | yes | Name of the option set to add the value to. | +| label | `String` | yes | Label for the new option. | +| value | `Nullable` | no | Numeric value for the new option. Auto-assigned if omitted (optional). | +| description | `String` | no | Description for the new option (optional). | +| color | `String` | no | Color associated with the option as hex string, e.g., '#FF0000' (optional). | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_metadata_create_choice.md b/docs/reference/mcp/tools/ppds_metadata_create_choice.md new file mode 100644 index 0000000..65893c2 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_metadata_create_choice.md @@ -0,0 +1,21 @@ + + +# ppds_metadata_create_choice + +Creates a new global choice (option set) in the specified solution. Options are provided as a JSON array of {label, value} objects. Supports dry-run mode. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solution | `String` | yes | Unique name of the solution to add the choice to. | +| schemaName | `String` | yes | Schema name for the global choice. | +| displayName | `String` | yes | Display name of the global choice. | +| description | `String` | yes | Description of the global choice. | +| optionsJson | `String` | yes | JSON array of option definitions: [{"label": "Active", "value": 1}, {"label": "Inactive", "value": 2}]. | +| dryRun | `Boolean` | no | If true, validates without persisting changes. | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_metadata_create_key.md b/docs/reference/mcp/tools/ppds_metadata_create_key.md new file mode 100644 index 0000000..26e5964 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_metadata_create_key.md @@ -0,0 +1,21 @@ + + +# ppds_metadata_create_key + +Creates an alternate key on a Dataverse table. Attributes can be provided as a comma-separated list or a JSON array of column logical names. Supports dry-run mode. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solution | `String` | yes | Unique name of the solution containing the table. | +| entityName | `String` | yes | Logical name of the entity to add the key to. | +| schemaName | `String` | yes | Schema name for the key. | +| displayName | `String` | yes | Display name of the key. | +| attributesJson | `String` | yes | Comma-separated column logical names or JSON array of strings (e.g., 'col1,col2' or '["col1","col2"]'). | +| dryRun | `Boolean` | no | If true, validates without persisting changes. | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_metadata_create_relationship.md b/docs/reference/mcp/tools/ppds_metadata_create_relationship.md new file mode 100644 index 0000000..5a3b471 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_metadata_create_relationship.md @@ -0,0 +1,23 @@ + + +# ppds_metadata_create_relationship + +Creates a relationship (one-to-many or many-to-many) between two Dataverse tables. For one-to-many, a lookup column is created on the referencing entity. Supports dry-run mode. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solution | `String` | yes | Unique name of the solution to add the relationship to. | +| referencedEntity | `String` | yes | Logical name of the referenced (parent / 'one' side) entity. | +| referencingEntity | `String` | yes | Logical name of the referencing (child / 'many' side) entity. | +| schemaName | `String` | yes | Schema name for the relationship. | +| relationshipType | `String` | yes | Relationship type: 'oneToMany' or 'manyToMany'. | +| lookupSchemaName | `String` | no | Schema name of the lookup column on the referencing entity (required for oneToMany, ignored for manyToMany). | +| lookupDisplayName | `String` | no | Display name of the lookup column (required for oneToMany, ignored for manyToMany). | +| dryRun | `Boolean` | no | If true, validates without persisting changes. | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_metadata_create_table.md b/docs/reference/mcp/tools/ppds_metadata_create_table.md new file mode 100644 index 0000000..f207890 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_metadata_create_table.md @@ -0,0 +1,22 @@ + + +# ppds_metadata_create_table + +Creates a new Dataverse table (entity) in the specified solution. Supports dry-run mode for validation without persisting changes. Use ppds_metadata_entities to verify the table was created. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solution | `String` | yes | Unique name of the solution to add the table to. | +| schemaName | `String` | yes | Schema name for the new table (e.g., 'new_MyTable'). Prefix is validated against the solution publisher. | +| displayName | `String` | yes | Display name of the table. | +| pluralName | `String` | yes | Plural display name of the table. | +| description | `String` | yes | Description of the table. | +| ownershipType | `String` | yes | Ownership type: 'UserOwned' or 'OrganizationOwned'. | +| dryRun | `Boolean` | no | If true, validates without persisting changes. | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_metadata_entities.md b/docs/reference/mcp/tools/ppds_metadata_entities.md new file mode 100644 index 0000000..fc3ccb3 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_metadata_entities.md @@ -0,0 +1,17 @@ + + +# ppds_metadata_entities + +Lists all entities (tables) in the connected Dataverse environment. Returns entity logical names, display names, schema names, and ownership type. Use this to discover available entities before querying with ppds_metadata_entity for full details. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| customOnly | `Boolean` | no | If true, only return custom entities (not system entities). | +| filter | `String` | no | Optional filter pattern to match entity logical names. Supports * wildcard (e.g., 'account*', '*custom*'). | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_metadata_entity.md b/docs/reference/mcp/tools/ppds_metadata_entity.md new file mode 100644 index 0000000..2275f2c --- /dev/null +++ b/docs/reference/mcp/tools/ppds_metadata_entity.md @@ -0,0 +1,18 @@ + + +# ppds_metadata_entity + +Get detailed metadata for a Dataverse entity including attributes, relationships, and keys. Use this to understand entity structure, field types, and how entities relate to each other. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| entityName | `String` | yes | Entity logical name (e.g., 'account', 'contact') | +| includeAttributes | `Boolean` | no | Include attribute details (default true) | +| includeRelationships | `Boolean` | no | Include relationship details (default false) | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_metadata_update_choice.md b/docs/reference/mcp/tools/ppds_metadata_update_choice.md new file mode 100644 index 0000000..362c858 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_metadata_update_choice.md @@ -0,0 +1,20 @@ + + +# ppds_metadata_update_choice + +Updates an existing global choice (option set). Only the provided optional fields are changed; omitted fields remain unchanged. Supports dry-run mode. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solution | `String` | yes | Unique name of the solution containing the global choice. | +| name | `String` | yes | Name of the global choice to update. | +| displayName | `String` | no | Updated display name (optional). | +| description | `String` | no | Updated description (optional). | +| dryRun | `Boolean` | no | If true, validates without persisting changes. | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_metadata_update_column.md b/docs/reference/mcp/tools/ppds_metadata_update_column.md new file mode 100644 index 0000000..69f8bcd --- /dev/null +++ b/docs/reference/mcp/tools/ppds_metadata_update_column.md @@ -0,0 +1,22 @@ + + +# ppds_metadata_update_column + +Updates an existing column (attribute) on a Dataverse table. Only the provided optional fields are changed; omitted fields remain unchanged. Supports dry-run mode. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solution | `String` | yes | Unique name of the solution containing the table. | +| entityName | `String` | yes | Logical name of the entity containing the column. | +| columnName | `String` | yes | Logical name of the column to update. | +| displayName | `String` | no | Updated display name (optional). | +| description | `String` | no | Updated description (optional). | +| requiredLevel | `String` | no | Updated requirement level: 'None', 'Recommended', or 'Required' (optional). | +| dryRun | `Boolean` | no | If true, validates without persisting changes. | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_metadata_update_relationship.md b/docs/reference/mcp/tools/ppds_metadata_update_relationship.md new file mode 100644 index 0000000..df43098 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_metadata_update_relationship.md @@ -0,0 +1,20 @@ + + +# ppds_metadata_update_relationship + +Updates an existing Dataverse relationship's cascade configuration. Only the provided optional fields are changed; omitted fields remain unchanged. Supports dry-run mode. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solution | `String` | yes | Unique name of the solution containing the relationship. | +| schemaName | `String` | yes | Schema name of the relationship to update. | +| cascadeDelete | `String` | no | Cascade behavior for delete: 'Cascade', 'NoCascade', 'RemoveLink', 'Restrict' (optional). | +| cascadeAssign | `String` | no | Cascade behavior for assign: 'Cascade', 'NoCascade', 'Active', 'UserOwned' (optional). | +| dryRun | `Boolean` | no | If true, validates without persisting changes. | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_metadata_update_table.md b/docs/reference/mcp/tools/ppds_metadata_update_table.md new file mode 100644 index 0000000..a83c00d --- /dev/null +++ b/docs/reference/mcp/tools/ppds_metadata_update_table.md @@ -0,0 +1,21 @@ + + +# ppds_metadata_update_table + +Updates an existing Dataverse table (entity). Only the provided optional fields are changed; omitted fields remain unchanged. Supports dry-run mode. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solution | `String` | yes | Unique name of the solution containing the table. | +| entityName | `String` | yes | Logical name of the entity to update. | +| displayName | `String` | no | Updated display name (optional). | +| pluralName | `String` | no | Updated plural display name (optional). | +| description | `String` | no | Updated description (optional). | +| dryRun | `Boolean` | no | If true, validates without persisting changes. | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_plugin_traces_delete.md b/docs/reference/mcp/tools/ppds_plugin_traces_delete.md new file mode 100644 index 0000000..a79103f --- /dev/null +++ b/docs/reference/mcp/tools/ppds_plugin_traces_delete.md @@ -0,0 +1,21 @@ + + +# ppds_plugin_traces_delete + +Delete plugin trace logs. Provide exactly one mode: specific IDs for targeted deletion, olderThanDays for age-based cleanup, or filter parameters (typeName, messageName, primaryEntity, errorsOnly) for criteria-based deletion. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| ids | `String[]` | no | Trace IDs to delete (array of GUID strings from ppds_plugin_traces_list) | +| olderThanDays | `Nullable` | no | Delete all traces older than this many days (minimum 1). Use for bulk cleanup. | +| typeName | `String` | no | Delete traces matching this plugin type name | +| messageName | `String` | no | Delete traces matching this message name (e.g., 'Create', 'Update') | +| primaryEntity | `String` | no | Delete traces matching this entity logical name (e.g., 'account') | +| errorsOnly | `Nullable` | no | Delete only traces that have exceptions | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_plugin_traces_get.md b/docs/reference/mcp/tools/ppds_plugin_traces_get.md new file mode 100644 index 0000000..52fde31 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_plugin_traces_get.md @@ -0,0 +1,16 @@ + + +# ppds_plugin_traces_get + +Get detailed information about a specific plugin trace including the full message block (trace output) and exception details. Use the trace ID from ppds_plugin_traces_list. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| traceId | `String` | yes | Trace ID (GUID) from ppds_plugin_traces_list | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_plugin_traces_list.md b/docs/reference/mcp/tools/ppds_plugin_traces_list.md new file mode 100644 index 0000000..a974d01 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_plugin_traces_list.md @@ -0,0 +1,20 @@ + + +# ppds_plugin_traces_list + +List plugin trace logs from Dataverse. Use this to find plugin execution logs, identify errors, and debug plugin behavior. Requires trace logging to be enabled in the environment. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| entity | `String` | no | Filter by entity logical name (e.g., 'account') | +| message | `String` | no | Filter by message name (e.g., 'Create', 'Update') | +| typeName | `String` | no | Filter by plugin type name | +| errorsOnly | `Boolean` | no | Show only traces with exceptions | +| maxRows | `Int32` | no | Maximum rows to return (default 50, max 500) | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_plugin_traces_timeline.md b/docs/reference/mcp/tools/ppds_plugin_traces_timeline.md new file mode 100644 index 0000000..adb6886 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_plugin_traces_timeline.md @@ -0,0 +1,16 @@ + + +# ppds_plugin_traces_timeline + +Build an execution timeline showing all plugin executions for a single transaction. Use the correlationId from ppds_plugin_traces_list to see how plugins chain together and identify performance bottlenecks. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| correlationId | `String` | yes | Correlation ID (GUID) from a trace - groups all traces from the same transaction | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_plugins_get.md b/docs/reference/mcp/tools/ppds_plugins_get.md new file mode 100644 index 0000000..f5ffaf9 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_plugins_get.md @@ -0,0 +1,17 @@ + + +# ppds_plugins_get + +Get detailed information for a specific plugin registration entity (assembly, package, type, step, or image). Use ppds_plugins_list first to discover entity names/IDs. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| type | `String` | yes | Entity type: assembly, package, type, step, or image | +| nameOrId | `String` | yes | Entity name or GUID | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_plugins_list.md b/docs/reference/mcp/tools/ppds_plugins_list.md new file mode 100644 index 0000000..9e88bb6 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_plugins_list.md @@ -0,0 +1,19 @@ + + +# ppds_plugins_list + +List registered plugin assemblies in the Dataverse environment. Shows plugin types and their registered steps (message/entity/stage combinations). By default excludes hidden system assemblies and Microsoft.* assemblies. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| nameFilter | `String` | no | Filter by assembly name (partial match) | +| includeHidden | `Boolean` | no | Include hidden system steps (default false) | +| includeMicrosoft | `Boolean` | no | Include Microsoft assemblies (default false) | +| maxRows | `Int32` | no | Maximum assemblies to return (default 50, max 200) | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_query_fetch.md b/docs/reference/mcp/tools/ppds_query_fetch.md new file mode 100644 index 0000000..a462ff1 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_query_fetch.md @@ -0,0 +1,17 @@ + + +# ppds_query_fetch + +Execute a FetchXML query against Dataverse. Use this when you have raw FetchXML or need advanced query features not available in SQL. Prefer ppds_query_sql for simpler queries. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| fetchXml | `String` | yes | FetchXML query string | +| maxRows | `Int32` | no | Maximum rows to return (default 100, max 5000) | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_query_sql.md b/docs/reference/mcp/tools/ppds_query_sql.md new file mode 100644 index 0000000..eafcdaa --- /dev/null +++ b/docs/reference/mcp/tools/ppds_query_sql.md @@ -0,0 +1,17 @@ + + +# ppds_query_sql + +Execute a SQL SELECT query against Dataverse. The SQL is transpiled to FetchXML internally. Supports JOINs, WHERE, ORDER BY, TOP, and aggregate functions. Example: SELECT name, revenue FROM account WHERE statecode = 0 ORDER BY revenue DESC + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| sql | `String` | yes | SQL SELECT statement (e.g., 'SELECT name, revenue FROM account WHERE statecode = 0') | +| maxRows | `Int32` | no | Maximum rows to return (default 100, max 5000) | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_service_endpoints_list.md b/docs/reference/mcp/tools/ppds_service_endpoints_list.md new file mode 100644 index 0000000..0608b4c --- /dev/null +++ b/docs/reference/mcp/tools/ppds_service_endpoints_list.md @@ -0,0 +1,14 @@ + + +# ppds_service_endpoints_list + +List all service endpoints and webhooks registered in the Dataverse environment. Includes Azure Service Bus (Queue, Topic, EventHub), REST endpoints, and HTTP webhooks. Used for event-driven integrations that receive Dataverse change notifications. + +## Input schema + +_No parameters._ + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_solutions_components.md b/docs/reference/mcp/tools/ppds_solutions_components.md new file mode 100644 index 0000000..66f907d --- /dev/null +++ b/docs/reference/mcp/tools/ppds_solutions_components.md @@ -0,0 +1,17 @@ + + +# ppds_solutions_components + +Get components of a Dataverse solution. Returns entities, workflows, plugins, and other components. Use the solution id from ppds_solutions_list. Optionally filter by component type code. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solutionId | `String` | yes | The solution ID (GUID) from ppds_solutions_list | +| componentType | `Nullable` | no | Optional component type code to filter by (e.g., 1 = Entity, 26 = View, 29 = Workflow) | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_solutions_list.md b/docs/reference/mcp/tools/ppds_solutions_list.md new file mode 100644 index 0000000..b5f3abe --- /dev/null +++ b/docs/reference/mcp/tools/ppds_solutions_list.md @@ -0,0 +1,17 @@ + + +# ppds_solutions_list + +List Dataverse solutions for the current environment. Shows solution name, version, publisher, and managed status. Use includeManaged to also show managed (system) solutions. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| filter | `String` | no | Optional filter by solution name (friendly name or unique name) | +| includeManaged | `Boolean` | no | Include managed solutions in the results (default false) | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_web_resources_get.md b/docs/reference/mcp/tools/ppds_web_resources_get.md new file mode 100644 index 0000000..76cb563 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_web_resources_get.md @@ -0,0 +1,17 @@ + + +# ppds_web_resources_get + +Get web resource content for viewing or analysis. Returns decoded text content for text types (JS, HTML, CSS, XML, etc.) and metadata-only for binary types (PNG, JPG, GIF). Use the id from ppds_web_resources_list. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| id | `String` | yes | The web resource ID (GUID) from ppds_web_resources_list | +| published | `Boolean` | no | If true, gets published content; if false, gets unpublished/draft content (default false) | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_web_resources_list.md b/docs/reference/mcp/tools/ppds_web_resources_list.md new file mode 100644 index 0000000..2fe22d9 --- /dev/null +++ b/docs/reference/mcp/tools/ppds_web_resources_list.md @@ -0,0 +1,19 @@ + + +# ppds_web_resources_list + +List web resources in a Dataverse environment, optionally filtered by solution. Returns name, type, managed status, and modification info. Use textOnly=true (default) to exclude binary types like images. Supports pagination via maxRows and nextPageToken parameters — when more records exist the response includes a nextPageToken to pass on the next call. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| solutionId | `String` | no | Optional solution ID (GUID) to filter web resources by solution | +| textOnly | `Boolean` | no | If true, only return text-based web resources like JS/HTML/CSS (default true) | +| maxRows | `Int32` | no | Maximum records per page (default 100, max 500) | +| nextPageToken | `String` | no | Pagination cursor from a previous call's nextPageToken field | + +## Output + +Returns `Task`. + diff --git a/docs/reference/mcp/tools/ppds_web_resources_publish.md b/docs/reference/mcp/tools/ppds_web_resources_publish.md new file mode 100644 index 0000000..55d523d --- /dev/null +++ b/docs/reference/mcp/tools/ppds_web_resources_publish.md @@ -0,0 +1,16 @@ + + +# ppds_web_resources_publish + +Publish specific web resources to make changes live. After updating web resource content, you must publish for changes to take effect. Provide one or more web resource IDs. + +## Input schema + +| Name | Type | Required | Description | +|------|------|----------|-------------| +| ids | `String[]` | yes | Array of web resource IDs (GUIDs) to publish | + +## Output + +Returns `Task`. +