Skip to content

Commit 2df0f71

Browse files
Narrow endpoint return types and encode cursor value types
Encode type information directly into cursor tokens as {"type": ..., "value": ...} objects, removing the fragile column-based type guessing during deserialization. Narrow return types for endpoints that only return offset pagination (patch, clear, batch, mapped) so the OpenAPI spec and generated UI client reflect the correct types. Only get_task_instances retains the discriminated union response. Update UI components to use the narrowed types from the spec.
1 parent d11e2a5 commit 2df0f71

18 files changed

Lines changed: 80 additions & 138 deletions

File tree

airflow-core/src/airflow/api_fastapi/core_api/openapi/v2-rest-api-generated.yaml

Lines changed: 8 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1987,14 +1987,7 @@ paths:
19871987
application/json:
19881988
schema:
19891989
anyOf:
1990-
- oneOf:
1991-
- $ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
1992-
- $ref: '#/components/schemas/TaskInstanceCursorCollectionResponse'
1993-
discriminator:
1994-
propertyName: pagination
1995-
mapping:
1996-
offset: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
1997-
cursor: '#/components/schemas/TaskInstanceCursorCollectionResponse'
1990+
- $ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
19981991
- $ref: '#/components/schemas/DAGRunResponse'
19991992
title: Response Clear Dag Run
20001993
'401':
@@ -5581,15 +5574,7 @@ paths:
55815574
content:
55825575
application/json:
55835576
schema:
5584-
oneOf:
5585-
- $ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
5586-
- $ref: '#/components/schemas/TaskInstanceCursorCollectionResponse'
5587-
discriminator:
5588-
propertyName: pagination
5589-
mapping:
5590-
offset: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
5591-
cursor: '#/components/schemas/TaskInstanceCursorCollectionResponse'
5592-
title: Response Patch Task Instance
5577+
$ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
55935578
'401':
55945579
content:
55955580
application/json:
@@ -6080,15 +6065,7 @@ paths:
60806065
content:
60816066
application/json:
60826067
schema:
6083-
oneOf:
6084-
- $ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
6085-
- $ref: '#/components/schemas/TaskInstanceCursorCollectionResponse'
6086-
discriminator:
6087-
propertyName: pagination
6088-
mapping:
6089-
offset: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
6090-
cursor: '#/components/schemas/TaskInstanceCursorCollectionResponse'
6091-
title: Response Get Mapped Task Instances
6068+
$ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
60926069
'401':
60936070
content:
60946071
application/json:
@@ -6502,15 +6479,7 @@ paths:
65026479
content:
65036480
application/json:
65046481
schema:
6505-
oneOf:
6506-
- $ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
6507-
- $ref: '#/components/schemas/TaskInstanceCursorCollectionResponse'
6508-
discriminator:
6509-
propertyName: pagination
6510-
mapping:
6511-
offset: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
6512-
cursor: '#/components/schemas/TaskInstanceCursorCollectionResponse'
6513-
title: Response Patch Task Instance By Map Index
6482+
$ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
65146483
'401':
65156484
content:
65166485
application/json:
@@ -7153,15 +7122,7 @@ paths:
71537122
content:
71547123
application/json:
71557124
schema:
7156-
oneOf:
7157-
- $ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
7158-
- $ref: '#/components/schemas/TaskInstanceCursorCollectionResponse'
7159-
discriminator:
7160-
propertyName: pagination
7161-
mapping:
7162-
offset: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
7163-
cursor: '#/components/schemas/TaskInstanceCursorCollectionResponse'
7164-
title: Response Get Task Instances Batch
7125+
$ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
71657126
'401':
71667127
content:
71677128
application/json:
@@ -7359,15 +7320,7 @@ paths:
73597320
content:
73607321
application/json:
73617322
schema:
7362-
oneOf:
7363-
- $ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
7364-
- $ref: '#/components/schemas/TaskInstanceCursorCollectionResponse'
7365-
discriminator:
7366-
propertyName: pagination
7367-
mapping:
7368-
offset: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
7369-
cursor: '#/components/schemas/TaskInstanceCursorCollectionResponse'
7370-
title: Response Post Clear Task Instances
7323+
$ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
73717324
'401':
73727325
content:
73737326
application/json:
@@ -7457,15 +7410,7 @@ paths:
74577410
content:
74587411
application/json:
74597412
schema:
7460-
oneOf:
7461-
- $ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
7462-
- $ref: '#/components/schemas/TaskInstanceCursorCollectionResponse'
7463-
discriminator:
7464-
propertyName: pagination
7465-
mapping:
7466-
offset: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
7467-
cursor: '#/components/schemas/TaskInstanceCursorCollectionResponse'
7468-
title: Response Patch Task Instance Dry Run By Map Index
7413+
$ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
74697414
'401':
74707415
content:
74717416
application/json:
@@ -7555,15 +7500,7 @@ paths:
75557500
content:
75567501
application/json:
75577502
schema:
7558-
oneOf:
7559-
- $ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
7560-
- $ref: '#/components/schemas/TaskInstanceCursorCollectionResponse'
7561-
discriminator:
7562-
propertyName: pagination
7563-
mapping:
7564-
offset: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
7565-
cursor: '#/components/schemas/TaskInstanceCursorCollectionResponse'
7566-
title: Response Patch Task Instance Dry Run
7503+
$ref: '#/components/schemas/TaskInstanceOffsetCollectionResponse'
75677504
'401':
75687505
content:
75697506
application/json:

airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@
7575
TriggerDAGRunPostBody,
7676
)
7777
from airflow.api_fastapi.core_api.datamodels.task_instances import (
78-
TaskInstanceCollectionResponse,
7978
TaskInstanceOffsetCollectionResponse,
8079
TaskInstanceResponse,
8180
)
@@ -287,7 +286,7 @@ def clear_dag_run(
287286
body: DAGRunClearBody,
288287
dag_bag: DagBagDep,
289288
session: SessionDep,
290-
) -> TaskInstanceCollectionResponse | DAGRunResponse:
289+
) -> TaskInstanceOffsetCollectionResponse | DAGRunResponse:
291290
dag_run = session.scalar(
292291
select(DagRun).filter_by(dag_id=dag_id, run_id=dag_run_id).options(joinedload(DagRun.dag_model))
293292
)

airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ def get_mapped_task_instances(
200200
),
201201
],
202202
session: SessionDep,
203-
) -> TaskInstanceCollectionResponse:
203+
) -> TaskInstanceOffsetCollectionResponse:
204204
"""Get list of mapped task instances."""
205205
query = eager_load_TI_and_TIH_for_validation(
206206
select(TI).where(
@@ -582,7 +582,7 @@ def get_task_instances_batch(
582582
body: TaskInstancesBatchBody,
583583
readable_ti_filter: ReadableTIFilterDep,
584584
session: SessionDep,
585-
) -> TaskInstanceCollectionResponse:
585+
) -> TaskInstanceOffsetCollectionResponse:
586586
"""Get list of task instances."""
587587
dag_ids = FilterParam(TI.dag_id, body.dag_ids, FilterOptionEnum.IN) # type: ignore[arg-type]
588588
dag_run_ids = FilterParam(TI.run_id, body.dag_run_ids, FilterOptionEnum.IN) # type: ignore[arg-type]
@@ -749,7 +749,7 @@ def post_clear_task_instances(
749749
body: ClearTaskInstancesBody,
750750
session: SessionDep,
751751
user: GetUserDep,
752-
) -> TaskInstanceCollectionResponse:
752+
) -> TaskInstanceOffsetCollectionResponse:
753753
"""Clear task instances."""
754754
dag = get_latest_version_of_dag(dag_bag, dag_id, session)
755755

@@ -919,7 +919,7 @@ def patch_task_instance_dry_run(
919919
session: SessionDep,
920920
map_index: int | None = None,
921921
update_mask: list[str] | None = Query(None),
922-
) -> TaskInstanceCollectionResponse:
922+
) -> TaskInstanceOffsetCollectionResponse:
923923
"""Update a task instance dry_run mode."""
924924
tis: Sequence[TI]
925925
dag, tis, data = _patch_ti_validate_request(
@@ -1019,7 +1019,7 @@ def patch_task_instance(
10191019
session: SessionDep,
10201020
map_index: int | None = None,
10211021
update_mask: list[str] | None = Query(None),
1022-
) -> TaskInstanceCollectionResponse:
1022+
) -> TaskInstanceOffsetCollectionResponse:
10231023
"""Update a task instance."""
10241024
dag, tis, data = _patch_ti_validate_request(
10251025
dag_id, dag_run_id, task_id, dag_bag, body, session, map_index, update_mask

airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ export const ensureUseTaskInstanceServiceGetTaskInstanceData = (queryClient: Que
768768
* @param data.limit
769769
* @param data.offset
770770
* @param data.orderBy Attributes to order by, multi criteria sort is supported. Prefix with `-` for descending order. Supported attributes: `id, state, duration, start_date, end_date, map_index, try_number, logical_date, run_after, data_interval_start, data_interval_end, rendered_map_index, operator, run_after, logical_date, data_interval_start, data_interval_end`
771-
* @returns unknown Successful Response
771+
* @returns TaskInstanceOffsetCollectionResponse Successful Response
772772
* @throws ApiError
773773
*/
774774
export const ensureUseTaskInstanceServiceGetMappedTaskInstancesData = (queryClient: QueryClient, { dagId, dagRunId, durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator, operatorNamePattern, orderBy, pool, poolNamePattern, queue, queueNamePattern, runAfterGt, runAfterGte, runAfterLt, runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte, state, taskId, tryNumber, updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte, versionNumber }: {

airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ export const prefetchUseTaskInstanceServiceGetTaskInstance = (queryClient: Query
768768
* @param data.limit
769769
* @param data.offset
770770
* @param data.orderBy Attributes to order by, multi criteria sort is supported. Prefix with `-` for descending order. Supported attributes: `id, state, duration, start_date, end_date, map_index, try_number, logical_date, run_after, data_interval_start, data_interval_end, rendered_map_index, operator, run_after, logical_date, data_interval_start, data_interval_end`
771-
* @returns unknown Successful Response
771+
* @returns TaskInstanceOffsetCollectionResponse Successful Response
772772
* @throws ApiError
773773
*/
774774
export const prefetchUseTaskInstanceServiceGetMappedTaskInstances = (queryClient: QueryClient, { dagId, dagRunId, durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator, operatorNamePattern, orderBy, pool, poolNamePattern, queue, queueNamePattern, runAfterGt, runAfterGte, runAfterLt, runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte, state, taskId, tryNumber, updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte, versionNumber }: {

airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ export const useTaskInstanceServiceGetTaskInstance = <TData = Common.TaskInstanc
768768
* @param data.limit
769769
* @param data.offset
770770
* @param data.orderBy Attributes to order by, multi criteria sort is supported. Prefix with `-` for descending order. Supported attributes: `id, state, duration, start_date, end_date, map_index, try_number, logical_date, run_after, data_interval_start, data_interval_end, rendered_map_index, operator, run_after, logical_date, data_interval_start, data_interval_end`
771-
* @returns unknown Successful Response
771+
* @returns TaskInstanceOffsetCollectionResponse Successful Response
772772
* @throws ApiError
773773
*/
774774
export const useTaskInstanceServiceGetMappedTaskInstances = <TData = Common.TaskInstanceServiceGetMappedTaskInstancesDefaultResponse, TError = unknown, TQueryKey extends Array<unknown> = unknown[]>({ dagId, dagRunId, durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator, operatorNamePattern, orderBy, pool, poolNamePattern, queue, queueNamePattern, runAfterGt, runAfterGte, runAfterLt, runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte, state, taskId, tryNumber, updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte, versionNumber }: {
@@ -1969,7 +1969,7 @@ export const useDagServiceUnfavoriteDag = <TData = Common.DagServiceUnfavoriteDa
19691969
* @param data.dagId
19701970
* @param data.dagRunId
19711971
* @param data.requestBody
1972-
* @returns unknown Successful Response
1972+
* @returns TaskInstanceOffsetCollectionResponse Successful Response
19731973
* @throws ApiError
19741974
*/
19751975
export const useTaskInstanceServiceGetTaskInstancesBatch = <TData = Common.TaskInstanceServiceGetTaskInstancesBatchMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {
@@ -1987,7 +1987,7 @@ export const useTaskInstanceServiceGetTaskInstancesBatch = <TData = Common.TaskI
19871987
* @param data The data for the request.
19881988
* @param data.dagId
19891989
* @param data.requestBody
1990-
* @returns unknown Successful Response
1990+
* @returns TaskInstanceOffsetCollectionResponse Successful Response
19911991
* @throws ApiError
19921992
*/
19931993
export const useTaskInstanceServicePostClearTaskInstances = <TData = Common.TaskInstanceServicePostClearTaskInstancesMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {
@@ -2234,7 +2234,7 @@ export const useDagServicePatchDag = <TData = Common.DagServicePatchDagMutationR
22342234
* @param data.requestBody
22352235
* @param data.mapIndex
22362236
* @param data.updateMask
2237-
* @returns unknown Successful Response
2237+
* @returns TaskInstanceOffsetCollectionResponse Successful Response
22382238
* @throws ApiError
22392239
*/
22402240
export const useTaskInstanceServicePatchTaskInstance = <TData = Common.TaskInstanceServicePatchTaskInstanceMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {
@@ -2262,7 +2262,7 @@ export const useTaskInstanceServicePatchTaskInstance = <TData = Common.TaskInsta
22622262
* @param data.mapIndex
22632263
* @param data.requestBody
22642264
* @param data.updateMask
2265-
* @returns unknown Successful Response
2265+
* @returns TaskInstanceOffsetCollectionResponse Successful Response
22662266
* @throws ApiError
22672267
*/
22682268
export const useTaskInstanceServicePatchTaskInstanceByMapIndex = <TData = Common.TaskInstanceServicePatchTaskInstanceByMapIndexMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {
@@ -2309,7 +2309,7 @@ export const useTaskInstanceServiceBulkTaskInstances = <TData = Common.TaskInsta
23092309
* @param data.mapIndex
23102310
* @param data.requestBody
23112311
* @param data.updateMask
2312-
* @returns unknown Successful Response
2312+
* @returns TaskInstanceOffsetCollectionResponse Successful Response
23132313
* @throws ApiError
23142314
*/
23152315
export const useTaskInstanceServicePatchTaskInstanceDryRunByMapIndex = <TData = Common.TaskInstanceServicePatchTaskInstanceDryRunByMapIndexMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {
@@ -2337,7 +2337,7 @@ export const useTaskInstanceServicePatchTaskInstanceDryRunByMapIndex = <TData =
23372337
* @param data.requestBody
23382338
* @param data.mapIndex
23392339
* @param data.updateMask
2340-
* @returns unknown Successful Response
2340+
* @returns TaskInstanceOffsetCollectionResponse Successful Response
23412341
* @throws ApiError
23422342
*/
23432343
export const useTaskInstanceServicePatchTaskInstanceDryRun = <TData = Common.TaskInstanceServicePatchTaskInstanceDryRunMutationResult, TError = unknown, TContext = unknown>(options?: Omit<UseMutationOptions<TData, TError, {

airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ export const useTaskInstanceServiceGetTaskInstanceSuspense = <TData = Common.Tas
768768
* @param data.limit
769769
* @param data.offset
770770
* @param data.orderBy Attributes to order by, multi criteria sort is supported. Prefix with `-` for descending order. Supported attributes: `id, state, duration, start_date, end_date, map_index, try_number, logical_date, run_after, data_interval_start, data_interval_end, rendered_map_index, operator, run_after, logical_date, data_interval_start, data_interval_end`
771-
* @returns unknown Successful Response
771+
* @returns TaskInstanceOffsetCollectionResponse Successful Response
772772
* @throws ApiError
773773
*/
774774
export const useTaskInstanceServiceGetMappedTaskInstancesSuspense = <TData = Common.TaskInstanceServiceGetMappedTaskInstancesDefaultResponse, TError = unknown, TQueryKey extends Array<unknown> = unknown[]>({ dagId, dagRunId, durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator, operatorNamePattern, orderBy, pool, poolNamePattern, queue, queueNamePattern, runAfterGt, runAfterGte, runAfterLt, runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte, state, taskId, tryNumber, updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte, versionNumber }: {

0 commit comments

Comments
 (0)