diff --git a/DataFactory.MCP.Core/Configuration/DataFactoryJsonContext.cs b/DataFactory.MCP.Core/Configuration/DataFactoryJsonContext.cs index b649247..13d81d2 100644 --- a/DataFactory.MCP.Core/Configuration/DataFactoryJsonContext.cs +++ b/DataFactory.MCP.Core/Configuration/DataFactoryJsonContext.cs @@ -3,6 +3,8 @@ using System.Text.Json; using System.Text.Json.Serialization; +using DataFactory.MCP.Models.AirflowJob; +using DataFactory.MCP.Models.AirflowJob.Definition; using DataFactory.MCP.Models.Capacity; using DataFactory.MCP.Models.Common; using DataFactory.MCP.Models.Connection; @@ -97,6 +99,16 @@ namespace DataFactory.MCP.Configuration; [JsonSerializable(typeof(JsonElement))] [JsonSerializable(typeof(EmptyRequest))] [JsonSerializable(typeof(RunOnDemandRequest))] +// AirflowJob types +[JsonSerializable(typeof(AirflowJob))] +[JsonSerializable(typeof(CreateAirflowJobRequest))] +[JsonSerializable(typeof(UpdateAirflowJobRequest))] +[JsonSerializable(typeof(ListAirflowJobsResponse))] +// AirflowJob Definition types +[JsonSerializable(typeof(AirflowJobDefinition))] +[JsonSerializable(typeof(AirflowJobDefinitionPart))] +[JsonSerializable(typeof(GetAirflowJobDefinitionResponse))] +[JsonSerializable(typeof(UpdateAirflowJobDefinitionRequest))] internal sealed partial class DataFactoryJsonContext : JsonSerializerContext { } diff --git a/DataFactory.MCP.Core/Resources/McpApps/package-lock.json b/DataFactory.MCP.Core/Resources/McpApps/package-lock.json index 7fa9fa8..682eaec 100644 --- a/DataFactory.MCP.Core/Resources/McpApps/package-lock.json +++ b/DataFactory.MCP.Core/Resources/McpApps/package-lock.json @@ -1860,9 +1860,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "funding": [ { "type": "github", diff --git a/DataFactory.MCP.Core/Services/FabricAirflowJobService.cs b/DataFactory.MCP.Core/Services/FabricAirflowJobService.cs index d0d7e81..c3f494f 100644 --- a/DataFactory.MCP.Core/Services/FabricAirflowJobService.cs +++ b/DataFactory.MCP.Core/Services/FabricAirflowJobService.cs @@ -4,6 +4,7 @@ using DataFactory.MCP.Infrastructure.Http; using DataFactory.MCP.Models.AirflowJob; using DataFactory.MCP.Models.AirflowJob.Definition; +using DataFactory.MCP.Models.Common; using Microsoft.Extensions.Logging; namespace DataFactory.MCP.Services; @@ -185,7 +186,7 @@ public async Task GetAirflowJobDefinitionAsync( Logger.LogInformation("Getting definition for Apache Airflow Job {AirflowJobId} in workspace {WorkspaceId}", airflowJobId, workspaceId); - var emptyRequest = new { }; + var emptyRequest = new EmptyRequest(); var response = await PostAsync(endpoint, emptyRequest) ?? throw new InvalidOperationException("Failed to get Apache Airflow Job definition response"); diff --git a/DataFactory.MCP.Tests/Integration/AirflowJobToolIntegrationTests.cs b/DataFactory.MCP.Tests/Integration/AirflowJobToolIntegrationTests.cs index dd8a93e..ef3d0d1 100644 --- a/DataFactory.MCP.Tests/Integration/AirflowJobToolIntegrationTests.cs +++ b/DataFactory.MCP.Tests/Integration/AirflowJobToolIntegrationTests.cs @@ -433,6 +433,13 @@ public async Task AirflowJob_FullLifecycle_CreateGetUpdateDeleteAsync() if (!IsValidJson(createResult)) return; // API may not support creation in test workspace var createJson = JsonDocument.Parse(createResult); + + // Skip if API returned an error (e.g., workspace doesn't support Airflow Jobs) + if (createJson.RootElement.TryGetProperty("success", out var successProp) && !successProp.GetBoolean()) + { + Skip.If(true, $"Skipping lifecycle test - create returned error: {createResult}"); + } + Assert.True(createJson.RootElement.TryGetProperty("airflowJobId", out var idElement), $"Create response missing airflowJobId. Response: {createResult}"); airflowJobId = idElement.GetString();