diff --git a/api/controllers/console/datasets/metadata.py b/api/controllers/console/datasets/metadata.py index c6d041fc59..4de5f32fb8 100644 --- a/api/controllers/console/datasets/metadata.py +++ b/api/controllers/console/datasets/metadata.py @@ -1,14 +1,18 @@ from typing import Literal -from flask_restx import Resource, marshal_with +from flask_restx import Resource from werkzeug.exceptions import NotFound from controllers.common.controller_schemas import MetadataUpdatePayload -from controllers.common.fields import SimpleResultResponse from controllers.common.schema import register_response_schema_models, register_schema_models from controllers.console import console_ns from controllers.console.wraps import account_initialization_required, enterprise_license_required, setup_required -from fields.dataset_fields import dataset_metadata_fields +from fields.dataset_fields import ( + DatasetMetadataBuiltInFieldsResponse, + DatasetMetadataListResponse, + DatasetMetadataResponse, +) +from libs.helper import dump_response from libs.login import current_account_with_tenant, login_required from services.dataset_service import DatasetService from services.entities.knowledge_entities.knowledge_entities import ( @@ -22,7 +26,12 @@ from services.metadata_service import MetadataService register_schema_models( console_ns, MetadataArgs, MetadataOperationData, MetadataUpdatePayload, DocumentMetadataOperation, MetadataDetail ) -register_response_schema_models(console_ns, SimpleResultResponse) +register_response_schema_models( + console_ns, + DatasetMetadataBuiltInFieldsResponse, + DatasetMetadataListResponse, + DatasetMetadataResponse, +) @console_ns.route("/datasets//metadata") @@ -31,7 +40,7 @@ class DatasetMetadataCreateApi(Resource): @login_required @account_initialization_required @enterprise_license_required - @marshal_with(dataset_metadata_fields) + @console_ns.response(201, "Metadata created successfully", console_ns.models[DatasetMetadataResponse.__name__]) @console_ns.expect(console_ns.models[MetadataArgs.__name__]) def post(self, dataset_id): current_user, _ = current_account_with_tenant() @@ -44,18 +53,22 @@ class DatasetMetadataCreateApi(Resource): DatasetService.check_dataset_permission(dataset, current_user) metadata = MetadataService.create_metadata(dataset_id_str, metadata_args) - return metadata, 201 + return dump_response(DatasetMetadataResponse, metadata), 201 @setup_required @login_required @account_initialization_required @enterprise_license_required + @console_ns.response( + 200, "Metadata retrieved successfully", console_ns.models[DatasetMetadataListResponse.__name__] + ) def get(self, dataset_id): dataset_id_str = str(dataset_id) dataset = DatasetService.get_dataset(dataset_id_str) if dataset is None: raise NotFound("Dataset not found.") - return MetadataService.get_dataset_metadatas(dataset), 200 + metadata = MetadataService.get_dataset_metadatas(dataset) + return dump_response(DatasetMetadataListResponse, metadata), 200 @console_ns.route("/datasets//metadata/") @@ -64,7 +77,7 @@ class DatasetMetadataApi(Resource): @login_required @account_initialization_required @enterprise_license_required - @marshal_with(dataset_metadata_fields) + @console_ns.response(200, "Metadata updated successfully", console_ns.models[DatasetMetadataResponse.__name__]) @console_ns.expect(console_ns.models[MetadataUpdatePayload.__name__]) def patch(self, dataset_id, metadata_id): current_user, _ = current_account_with_tenant() @@ -79,7 +92,7 @@ class DatasetMetadataApi(Resource): DatasetService.check_dataset_permission(dataset, current_user) metadata = MetadataService.update_metadata_name(dataset_id_str, metadata_id_str, name) - return metadata, 200 + return dump_response(DatasetMetadataResponse, metadata), 200 @setup_required @login_required @@ -96,7 +109,8 @@ class DatasetMetadataApi(Resource): DatasetService.check_dataset_permission(dataset, current_user) MetadataService.delete_metadata(dataset_id_str, metadata_id_str) - return {"result": "success"}, 204 + # Frontend callers only await success and invalidate metadata caches; no response body is consumed. + return "", 204 @console_ns.route("/datasets/metadata/built-in") @@ -105,9 +119,14 @@ class DatasetMetadataBuiltInFieldApi(Resource): @login_required @account_initialization_required @enterprise_license_required + @console_ns.response( + 200, + "Built-in fields retrieved successfully", + console_ns.models[DatasetMetadataBuiltInFieldsResponse.__name__], + ) def get(self): built_in_fields = MetadataService.get_built_in_fields() - return {"fields": built_in_fields}, 200 + return dump_response(DatasetMetadataBuiltInFieldsResponse, {"fields": built_in_fields}), 200 @console_ns.route("/datasets//metadata/built-in/") @@ -116,7 +135,7 @@ class DatasetMetadataBuiltInFieldActionApi(Resource): @login_required @account_initialization_required @enterprise_license_required - @console_ns.response(200, "Success", console_ns.models[SimpleResultResponse.__name__]) + @console_ns.response(204, "Action completed successfully") def post(self, dataset_id, action: Literal["enable", "disable"]): current_user, _ = current_account_with_tenant() dataset_id_str = str(dataset_id) @@ -130,7 +149,8 @@ class DatasetMetadataBuiltInFieldActionApi(Resource): MetadataService.enable_built_in_field(dataset) case "disable": MetadataService.disable_built_in_field(dataset) - return {"result": "success"}, 200 + # Frontend callers only await success and invalidate metadata caches; no response body is consumed. + return "", 204 @console_ns.route("/datasets//documents/metadata") @@ -140,7 +160,10 @@ class DocumentMetadataEditApi(Resource): @account_initialization_required @enterprise_license_required @console_ns.expect(console_ns.models[MetadataOperationData.__name__]) - @console_ns.response(200, "Success", console_ns.models[SimpleResultResponse.__name__]) + @console_ns.response( + 204, + "Documents metadata updated successfully", + ) def post(self, dataset_id): current_user, _ = current_account_with_tenant() dataset_id_str = str(dataset_id) @@ -153,4 +176,5 @@ class DocumentMetadataEditApi(Resource): MetadataService.update_documents_metadata(dataset, metadata_args) - return {"result": "success"}, 200 + # Frontend callers only await success and invalidate caches; no response body is consumed. + return "", 204 diff --git a/api/controllers/service_api/dataset/metadata.py b/api/controllers/service_api/dataset/metadata.py index afab582bf2..58bdd0f611 100644 --- a/api/controllers/service_api/dataset/metadata.py +++ b/api/controllers/service_api/dataset/metadata.py @@ -1,15 +1,19 @@ from typing import Literal from flask_login import current_user -from flask_restx import marshal from werkzeug.exceptions import NotFound from controllers.common.controller_schemas import MetadataUpdatePayload -from controllers.common.fields import SimpleResultResponse from controllers.common.schema import register_response_schema_models, register_schema_model, register_schema_models from controllers.service_api import service_api_ns from controllers.service_api.wraps import DatasetApiResource, cloud_edition_billing_rate_limit_check -from fields.dataset_fields import dataset_metadata_fields +from fields.dataset_fields import ( + DatasetMetadataActionResponse, + DatasetMetadataBuiltInFieldsResponse, + DatasetMetadataListResponse, + DatasetMetadataResponse, +) +from libs.helper import dump_response from services.dataset_service import DatasetService from services.entities.knowledge_entities.knowledge_entities import ( DocumentMetadataOperation, @@ -27,7 +31,13 @@ register_schema_models( DocumentMetadataOperation, MetadataOperationData, ) -register_response_schema_models(service_api_ns, SimpleResultResponse) +register_response_schema_models( + service_api_ns, + DatasetMetadataActionResponse, + DatasetMetadataBuiltInFieldsResponse, + DatasetMetadataListResponse, + DatasetMetadataResponse, +) @service_api_ns.route("/datasets//metadata") @@ -43,6 +53,9 @@ class DatasetMetadataCreateServiceApi(DatasetApiResource): 404: "Dataset not found", } ) + @service_api_ns.response( + 201, "Metadata created successfully", service_api_ns.models[DatasetMetadataResponse.__name__] + ) @cloud_edition_billing_rate_limit_check("knowledge", "dataset") def post(self, tenant_id, dataset_id): """Create metadata for a dataset.""" @@ -55,7 +68,7 @@ class DatasetMetadataCreateServiceApi(DatasetApiResource): DatasetService.check_dataset_permission(dataset, current_user) metadata = MetadataService.create_metadata(dataset_id_str, metadata_args) - return marshal(metadata, dataset_metadata_fields), 201 + return dump_response(DatasetMetadataResponse, metadata), 201 @service_api_ns.doc("get_dataset_metadata") @service_api_ns.doc(description="Get all metadata for a dataset") @@ -67,13 +80,17 @@ class DatasetMetadataCreateServiceApi(DatasetApiResource): 404: "Dataset not found", } ) + @service_api_ns.response( + 200, "Metadata retrieved successfully", service_api_ns.models[DatasetMetadataListResponse.__name__] + ) def get(self, tenant_id, dataset_id): """Get all metadata for a dataset.""" dataset_id_str = str(dataset_id) dataset = DatasetService.get_dataset(dataset_id_str) if dataset is None: raise NotFound("Dataset not found.") - return MetadataService.get_dataset_metadatas(dataset), 200 + metadata = MetadataService.get_dataset_metadatas(dataset) + return dump_response(DatasetMetadataListResponse, metadata), 200 @service_api_ns.route("/datasets//metadata/") @@ -89,6 +106,9 @@ class DatasetMetadataServiceApi(DatasetApiResource): 404: "Dataset or metadata not found", } ) + @service_api_ns.response( + 200, "Metadata updated successfully", service_api_ns.models[DatasetMetadataResponse.__name__] + ) @cloud_edition_billing_rate_limit_check("knowledge", "dataset") def patch(self, tenant_id, dataset_id, metadata_id): """Update metadata name.""" @@ -102,7 +122,7 @@ class DatasetMetadataServiceApi(DatasetApiResource): DatasetService.check_dataset_permission(dataset, current_user) metadata = MetadataService.update_metadata_name(dataset_id_str, metadata_id_str, payload.name) - return marshal(metadata, dataset_metadata_fields), 200 + return dump_response(DatasetMetadataResponse, metadata), 200 @service_api_ns.doc("delete_dataset_metadata") @service_api_ns.doc(description="Delete metadata") @@ -114,6 +134,7 @@ class DatasetMetadataServiceApi(DatasetApiResource): 404: "Dataset or metadata not found", } ) + @service_api_ns.response(204, "Metadata deleted successfully") @cloud_edition_billing_rate_limit_check("knowledge", "dataset") def delete(self, tenant_id, dataset_id, metadata_id): """Delete metadata.""" @@ -138,10 +159,15 @@ class DatasetMetadataBuiltInFieldServiceApi(DatasetApiResource): 401: "Unauthorized - invalid API token", } ) + @service_api_ns.response( + 200, + "Built-in fields retrieved successfully", + service_api_ns.models[DatasetMetadataBuiltInFieldsResponse.__name__], + ) def get(self, tenant_id, dataset_id): """Get all built-in metadata fields.""" built_in_fields = MetadataService.get_built_in_fields() - return {"fields": built_in_fields}, 200 + return dump_response(DatasetMetadataBuiltInFieldsResponse, {"fields": built_in_fields}), 200 @service_api_ns.route("/datasets//metadata/built-in/") @@ -157,9 +183,7 @@ class DatasetMetadataBuiltInFieldActionServiceApi(DatasetApiResource): } ) @service_api_ns.response( - 200, - "Action completed successfully", - service_api_ns.models[SimpleResultResponse.__name__], + 200, "Action completed successfully", service_api_ns.models[DatasetMetadataActionResponse.__name__] ) @cloud_edition_billing_rate_limit_check("knowledge", "dataset") def post(self, tenant_id, dataset_id, action: Literal["enable", "disable"]): @@ -175,7 +199,7 @@ class DatasetMetadataBuiltInFieldActionServiceApi(DatasetApiResource): MetadataService.enable_built_in_field(dataset) case "disable": MetadataService.disable_built_in_field(dataset) - return {"result": "success"}, 200 + return dump_response(DatasetMetadataActionResponse, {"result": "success"}), 200 @service_api_ns.route("/datasets//documents/metadata") @@ -194,7 +218,7 @@ class DocumentMetadataEditServiceApi(DatasetApiResource): @service_api_ns.response( 200, "Documents metadata updated successfully", - service_api_ns.models[SimpleResultResponse.__name__], + service_api_ns.models[DatasetMetadataActionResponse.__name__], ) @cloud_edition_billing_rate_limit_check("knowledge", "dataset") def post(self, tenant_id, dataset_id): @@ -209,4 +233,4 @@ class DocumentMetadataEditServiceApi(DatasetApiResource): MetadataService.update_documents_metadata(dataset, metadata_args) - return {"result": "success"}, 200 + return dump_response(DatasetMetadataActionResponse, {"result": "success"}), 200 diff --git a/api/fields/api_based_extension_fields.py b/api/fields/api_based_extension_fields.py deleted file mode 100644 index a2dda1dc15..0000000000 --- a/api/fields/api_based_extension_fields.py +++ /dev/null @@ -1,23 +0,0 @@ -from flask_restx import fields - -from libs.helper import TimestampField - - -class HiddenAPIKey(fields.Raw): - def output(self, key, obj, **kwargs): - api_key = obj.api_key - # If the length of the api_key is less than 8 characters, show the first and last characters - if len(api_key) <= 8: - return api_key[0] + "******" + api_key[-1] - # If the api_key is greater than 8 characters, show the first three and the last three characters - else: - return api_key[:3] + "******" + api_key[-3:] - - -api_based_extension_fields = { - "id": fields.String, - "name": fields.String, - "api_endpoint": fields.String, - "api_key": HiddenAPIKey, - "created_at": TimestampField, -} diff --git a/api/fields/dataset_fields.py b/api/fields/dataset_fields.py index ff6578098b..4411ee0465 100644 --- a/api/fields/dataset_fields.py +++ b/api/fields/dataset_fields.py @@ -1,5 +1,6 @@ from flask_restx import fields +from fields.base import ResponseModel from libs.helper import TimestampField dataset_fields = { @@ -13,6 +14,38 @@ dataset_fields = { "created_at": TimestampField, } + +class DatasetMetadataResponse(ResponseModel): + id: str + type: str + name: str + + +class DatasetMetadataListItemResponse(ResponseModel): + id: str + name: str + type: str + count: int = 0 + + +class DatasetMetadataListResponse(ResponseModel): + doc_metadata: list[DatasetMetadataListItemResponse] + built_in_field_enabled: bool + + +class DatasetMetadataBuiltInFieldResponse(ResponseModel): + name: str + type: str + + +class DatasetMetadataBuiltInFieldsResponse(ResponseModel): + fields: list[DatasetMetadataBuiltInFieldResponse] + + +class DatasetMetadataActionResponse(ResponseModel): + result: str + + reranking_model_fields = {"reranking_provider_name": fields.String, "reranking_model_name": fields.String} keyword_setting_fields = {"keyword_weight": fields.Float} @@ -133,9 +166,3 @@ dataset_query_detail_fields = { "created_by": fields.String, "created_at": TimestampField, } - -dataset_metadata_fields = { - "id": fields.String, - "type": fields.String, - "name": fields.String, -} diff --git a/api/fields/installed_app_fields.py b/api/fields/installed_app_fields.py deleted file mode 100644 index 16dd26a10e..0000000000 --- a/api/fields/installed_app_fields.py +++ /dev/null @@ -1,26 +0,0 @@ -from flask_restx import fields - -from libs.helper import AppIconUrlField, TimestampField - -app_fields = { - "id": fields.String, - "name": fields.String, - "mode": fields.String, - "icon_type": fields.String, - "icon": fields.String, - "icon_background": fields.String, - "icon_url": AppIconUrlField, - "use_icon_as_answer_icon": fields.Boolean, -} - -installed_app_fields = { - "id": fields.String, - "app": fields.Nested(app_fields), - "app_owner_tenant_id": fields.String, - "is_pinned": fields.Boolean, - "last_used_at": TimestampField, - "editable": fields.Boolean, - "uninstallable": fields.Boolean, -} - -installed_app_list_fields = {"installed_apps": fields.List(fields.Nested(installed_app_fields))} diff --git a/api/fields/workflow_app_log_fields.py b/api/fields/workflow_app_log_fields.py deleted file mode 100644 index a70f051807..0000000000 --- a/api/fields/workflow_app_log_fields.py +++ /dev/null @@ -1,142 +0,0 @@ -from __future__ import annotations - -from datetime import datetime -from typing import Any - -from flask_restx import Namespace, fields -from pydantic import field_validator - -from fields.base import ResponseModel -from fields.end_user_fields import SimpleEndUser, simple_end_user_fields -from fields.member_fields import SimpleAccount, simple_account_fields -from fields.workflow_run_fields import ( - WorkflowRunForArchivedLogResponse, - WorkflowRunForLogResponse, - build_workflow_run_for_archived_log_model, - build_workflow_run_for_log_model, - workflow_run_for_archived_log_fields, - workflow_run_for_log_fields, -) -from libs.helper import TimestampField, to_timestamp - -workflow_app_log_partial_fields = { - "id": fields.String, - "workflow_run": fields.Nested(workflow_run_for_log_fields, attribute="workflow_run", allow_null=True), - "details": fields.Raw(attribute="details"), - "created_from": fields.String, - "created_by_role": fields.String, - "created_by_account": fields.Nested(simple_account_fields, attribute="created_by_account", allow_null=True), - "created_by_end_user": fields.Nested(simple_end_user_fields, attribute="created_by_end_user", allow_null=True), - "created_at": TimestampField, -} - - -def build_workflow_app_log_partial_model(api_or_ns: Namespace): - """Build the workflow app log partial model for the API or Namespace.""" - workflow_run_model = build_workflow_run_for_log_model(api_or_ns) - - copied_fields = workflow_app_log_partial_fields.copy() - copied_fields["workflow_run"] = fields.Nested(workflow_run_model, attribute="workflow_run", allow_null=True) - return api_or_ns.model("WorkflowAppLogPartial", copied_fields) - - -workflow_archived_log_partial_fields = { - "id": fields.String, - "workflow_run": fields.Nested(workflow_run_for_archived_log_fields, allow_null=True), - "trigger_metadata": fields.Raw, - "created_by_account": fields.Nested(simple_account_fields, attribute="created_by_account", allow_null=True), - "created_by_end_user": fields.Nested(simple_end_user_fields, attribute="created_by_end_user", allow_null=True), - "created_at": TimestampField, -} - - -def build_workflow_archived_log_partial_model(api_or_ns: Namespace): - """Build the workflow archived log partial model for the API or Namespace.""" - workflow_run_model = build_workflow_run_for_archived_log_model(api_or_ns) - - copied_fields = workflow_archived_log_partial_fields.copy() - copied_fields["workflow_run"] = fields.Nested(workflow_run_model, allow_null=True) - return api_or_ns.model("WorkflowArchivedLogPartial", copied_fields) - - -workflow_app_log_pagination_fields = { - "page": fields.Integer, - "limit": fields.Integer, - "total": fields.Integer, - "has_more": fields.Boolean, - "data": fields.List(fields.Nested(workflow_app_log_partial_fields)), -} - - -def build_workflow_app_log_pagination_model(api_or_ns: Namespace): - """Build the workflow app log pagination model for the API or Namespace.""" - # Build the nested partial model first - workflow_app_log_partial_model = build_workflow_app_log_partial_model(api_or_ns) - - copied_fields = workflow_app_log_pagination_fields.copy() - copied_fields["data"] = fields.List(fields.Nested(workflow_app_log_partial_model)) - return api_or_ns.model("WorkflowAppLogPagination", copied_fields) - - -workflow_archived_log_pagination_fields = { - "page": fields.Integer, - "limit": fields.Integer, - "total": fields.Integer, - "has_more": fields.Boolean, - "data": fields.List(fields.Nested(workflow_archived_log_partial_fields)), -} - - -def build_workflow_archived_log_pagination_model(api_or_ns: Namespace): - """Build the workflow archived log pagination model for the API or Namespace.""" - workflow_archived_log_partial_model = build_workflow_archived_log_partial_model(api_or_ns) - - copied_fields = workflow_archived_log_pagination_fields.copy() - copied_fields["data"] = fields.List(fields.Nested(workflow_archived_log_partial_model)) - return api_or_ns.model("WorkflowArchivedLogPagination", copied_fields) - - -class WorkflowAppLogPartialResponse(ResponseModel): - id: str - workflow_run: WorkflowRunForLogResponse | None = None - details: Any = None - created_from: str | None = None - created_by_role: str | None = None - created_by_account: SimpleAccount | None = None - created_by_end_user: SimpleEndUser | None = None - created_at: int | None = None - - @field_validator("created_at", mode="before") - @classmethod - def _normalize_timestamp(cls, value: datetime | int | None) -> int | None: - return to_timestamp(value) - - -class WorkflowArchivedLogPartialResponse(ResponseModel): - id: str - workflow_run: WorkflowRunForArchivedLogResponse | None = None - trigger_metadata: Any = None - created_by_account: SimpleAccount | None = None - created_by_end_user: SimpleEndUser | None = None - created_at: int | None = None - - @field_validator("created_at", mode="before") - @classmethod - def _normalize_timestamp(cls, value: datetime | int | None) -> int | None: - return to_timestamp(value) - - -class WorkflowAppLogPaginationResponse(ResponseModel): - page: int - limit: int - total: int - has_more: bool - data: list[WorkflowAppLogPartialResponse] - - -class WorkflowArchivedLogPaginationResponse(ResponseModel): - page: int - limit: int - total: int - has_more: bool - data: list[WorkflowArchivedLogPartialResponse] diff --git a/api/fields/workflow_trigger_fields.py b/api/fields/workflow_trigger_fields.py deleted file mode 100644 index ce51d1833a..0000000000 --- a/api/fields/workflow_trigger_fields.py +++ /dev/null @@ -1,25 +0,0 @@ -from flask_restx import fields - -trigger_fields = { - "id": fields.String, - "trigger_type": fields.String, - "title": fields.String, - "node_id": fields.String, - "provider_name": fields.String, - "icon": fields.String, - "status": fields.String, - "created_at": fields.DateTime(dt_format="iso8601"), - "updated_at": fields.DateTime(dt_format="iso8601"), -} - -triggers_list_fields = {"data": fields.List(fields.Nested(trigger_fields))} - - -webhook_trigger_fields = { - "id": fields.String, - "webhook_id": fields.String, - "webhook_url": fields.String, - "webhook_debug_url": fields.String, - "node_id": fields.String, - "created_at": fields.DateTime(dt_format="iso8601"), -} diff --git a/api/openapi/markdown/console-swagger.md b/api/openapi/markdown/console-swagger.md index cc8c1e1d6b..b270d970be 100644 --- a/api/openapi/markdown/console-swagger.md +++ b/api/openapi/markdown/console-swagger.md @@ -4413,9 +4413,9 @@ Initialize dataset with documents #### GET ##### Responses -| Code | Description | -| ---- | ----------- | -| 200 | Success | +| Code | Description | Schema | +| ---- | ----------- | ------ | +| 200 | Built-in fields retrieved successfully | [DatasetMetadataBuiltInFieldsResponse](#datasetmetadatabuiltinfieldsresponse) | ### /datasets/notion-indexing-estimate @@ -4730,9 +4730,9 @@ then asynchronously generates summary indexes for the provided documents. ##### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | [SimpleResultResponse](#simpleresultresponse) | +| Code | Description | +| ---- | ----------- | +| 204 | Documents metadata updated successfully | ### /datasets/{dataset_id}/documents/status/{action}/batch @@ -5342,9 +5342,9 @@ Get dataset indexing status ##### Responses -| Code | Description | -| ---- | ----------- | -| 200 | Success | +| Code | Description | Schema | +| ---- | ----------- | ------ | +| 200 | Metadata retrieved successfully | [DatasetMetadataListResponse](#datasetmetadatalistresponse) | #### POST ##### Parameters @@ -5356,9 +5356,9 @@ Get dataset indexing status ##### Responses -| Code | Description | -| ---- | ----------- | -| 200 | Success | +| Code | Description | Schema | +| ---- | ----------- | ------ | +| 201 | Metadata created successfully | [DatasetMetadataResponse](#datasetmetadataresponse) | ### /datasets/{dataset_id}/metadata/built-in/{action} @@ -5372,9 +5372,9 @@ Get dataset indexing status ##### Responses -| Code | Description | Schema | -| ---- | ----------- | ------ | -| 200 | Success | [SimpleResultResponse](#simpleresultresponse) | +| Code | Description | +| ---- | ----------- | +| 204 | Action completed successfully | ### /datasets/{dataset_id}/metadata/{metadata_id} @@ -5403,9 +5403,9 @@ Get dataset indexing status ##### Responses -| Code | Description | -| ---- | ----------- | -| 200 | Success | +| Code | Description | Schema | +| ---- | ----------- | ------ | +| 200 | Metadata updated successfully | [DatasetMetadataResponse](#datasetmetadataresponse) | ### /datasets/{dataset_id}/notion/sync @@ -11733,6 +11733,43 @@ Condition detail | ---- | ---- | ----------- | -------- | | keyword_weight | number | | No | +#### DatasetMetadataBuiltInFieldResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| name | string | | Yes | +| type | string | | Yes | + +#### DatasetMetadataBuiltInFieldsResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| fields | [ [DatasetMetadataBuiltInFieldResponse](#datasetmetadatabuiltinfieldresponse) ] | | Yes | + +#### DatasetMetadataListItemResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| count | integer | | No | +| id | string | | Yes | +| name | string | | Yes | +| type | string | | Yes | + +#### DatasetMetadataListResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| built_in_field_enabled | boolean | | Yes | +| doc_metadata | [ [DatasetMetadataListItemResponse](#datasetmetadatalistitemresponse) ] | | Yes | + +#### DatasetMetadataResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| id | string | | Yes | +| name | string | | Yes | +| type | string | | Yes | + #### DatasetPermissionEnum | Name | Type | Description | Required | diff --git a/api/openapi/markdown/service-swagger.md b/api/openapi/markdown/service-swagger.md index 87dbe8c1ba..17058e5e62 100644 --- a/api/openapi/markdown/service-swagger.md +++ b/api/openapi/markdown/service-swagger.md @@ -877,7 +877,7 @@ Update metadata for multiple documents | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Documents metadata updated successfully | [SimpleResultResponse](#simpleresultresponse) | +| 200 | Documents metadata updated successfully | [DatasetMetadataActionResponse](#datasetmetadataactionresponse) | | 401 | Unauthorized - invalid API token | | | 404 | Dataset not found | | @@ -1378,11 +1378,11 @@ Get all metadata for a dataset ##### Responses -| Code | Description | -| ---- | ----------- | -| 200 | Metadata retrieved successfully | -| 401 | Unauthorized - invalid API token | -| 404 | Dataset not found | +| Code | Description | Schema | +| ---- | ----------- | ------ | +| 200 | Metadata retrieved successfully | [DatasetMetadataListResponse](#datasetmetadatalistresponse) | +| 401 | Unauthorized - invalid API token | | +| 404 | Dataset not found | | #### POST ##### Summary @@ -1402,11 +1402,11 @@ Create metadata for a dataset ##### Responses -| Code | Description | -| ---- | ----------- | -| 201 | Metadata created successfully | -| 401 | Unauthorized - invalid API token | -| 404 | Dataset not found | +| Code | Description | Schema | +| ---- | ----------- | ------ | +| 201 | Metadata created successfully | [DatasetMetadataResponse](#datasetmetadataresponse) | +| 401 | Unauthorized - invalid API token | | +| 404 | Dataset not found | | ### /datasets/{dataset_id}/metadata/built-in @@ -1427,10 +1427,10 @@ Get all built-in metadata fields ##### Responses -| Code | Description | -| ---- | ----------- | -| 200 | Built-in fields retrieved successfully | -| 401 | Unauthorized - invalid API token | +| Code | Description | Schema | +| ---- | ----------- | ------ | +| 200 | Built-in fields retrieved successfully | [DatasetMetadataBuiltInFieldsResponse](#datasetmetadatabuiltinfieldsresponse) | +| 401 | Unauthorized - invalid API token | | ### /datasets/{dataset_id}/metadata/built-in/{action} @@ -1454,7 +1454,7 @@ Enable or disable built-in metadata field | Code | Description | Schema | | ---- | ----------- | ------ | -| 200 | Action completed successfully | [SimpleResultResponse](#simpleresultresponse) | +| 200 | Action completed successfully | [DatasetMetadataActionResponse](#datasetmetadataactionresponse) | | 401 | Unauthorized - invalid API token | | | 404 | Dataset not found | | @@ -1503,11 +1503,11 @@ Update metadata name ##### Responses -| Code | Description | -| ---- | ----------- | -| 200 | Metadata updated successfully | -| 401 | Unauthorized - invalid API token | -| 404 | Dataset or metadata not found | +| Code | Description | Schema | +| ---- | ----------- | ------ | +| 200 | Metadata updated successfully | [DatasetMetadataResponse](#datasetmetadataresponse) | +| 401 | Unauthorized - invalid API token | | +| 404 | Dataset or metadata not found | | ### /datasets/{dataset_id}/pipeline/datasource-plugins @@ -2314,6 +2314,49 @@ Condition detail | page | integer | Page number | No | | tag_ids | [ string ] | Filter by tag IDs | No | +#### DatasetMetadataActionResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| result | string | | Yes | + +#### DatasetMetadataBuiltInFieldResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| name | string | | Yes | +| type | string | | Yes | + +#### DatasetMetadataBuiltInFieldsResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| fields | [ [DatasetMetadataBuiltInFieldResponse](#datasetmetadatabuiltinfieldresponse) ] | | Yes | + +#### DatasetMetadataListItemResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| count | integer | | No | +| id | string | | Yes | +| name | string | | Yes | +| type | string | | Yes | + +#### DatasetMetadataListResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| built_in_field_enabled | boolean | | Yes | +| doc_metadata | [ [DatasetMetadataListItemResponse](#datasetmetadatalistitemresponse) ] | | Yes | + +#### DatasetMetadataResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| id | string | | Yes | +| name | string | | Yes | +| type | string | | Yes | + #### DatasetPermissionEnum | Name | Type | Description | Required | diff --git a/api/tests/unit_tests/controllers/console/datasets/test_metadata.py b/api/tests/unit_tests/controllers/console/datasets/test_metadata.py index 6322133536..b2863fc8cd 100644 --- a/api/tests/unit_tests/controllers/console/datasets/test_metadata.py +++ b/api/tests/unit_tests/controllers/console/datasets/test_metadata.py @@ -117,12 +117,13 @@ class TestDatasetMetadataCreateApi: patch.object( MetadataService, "create_metadata", - return_value={"id": "m1", "name": "author"}, + return_value={"id": "m1", "type": "string", "name": "author"}, ), ): result, status = method(api, dataset_id) assert status == 201 + assert result["type"] == "string" assert result["name"] == "author" def test_create_metadata_dataset_not_found(self, app: Flask, current_user, dataset_id): @@ -176,13 +177,17 @@ class TestDatasetMetadataGetApi: patch.object( MetadataService, "get_dataset_metadatas", - return_value=[{"id": "m1"}], + return_value={ + "doc_metadata": [{"id": "m1", "name": "author", "type": "string", "count": 0}], + "built_in_field_enabled": False, + }, ), ): result, status = method(api, dataset_id) assert status == 200 - assert isinstance(result, list) + assert result["doc_metadata"] == [{"id": "m1", "name": "author", "type": "string", "count": 0}] + assert result["built_in_field_enabled"] is False def test_get_metadata_dataset_not_found(self, app: Flask, dataset_id): api = DatasetMetadataCreateApi() @@ -231,12 +236,13 @@ class TestDatasetMetadataApi: patch.object( MetadataService, "update_metadata_name", - return_value={"id": "m1", "name": "updated-name"}, + return_value={"id": "m1", "type": "string", "name": "updated-name"}, ), ): result, status = method(api, dataset_id, metadata_id) assert status == 200 + assert result["type"] == "string" assert result["name"] == "updated-name" def test_delete_metadata_success(self, app: Flask, current_user, dataset, dataset_id, metadata_id): @@ -266,7 +272,7 @@ class TestDatasetMetadataApi: result, status = method(api, dataset_id, metadata_id) assert status == 204 - assert result["result"] == "success" + assert result == "" class TestDatasetMetadataBuiltInFieldApi: @@ -279,13 +285,19 @@ class TestDatasetMetadataBuiltInFieldApi: patch.object( MetadataService, "get_built_in_fields", - return_value=["title", "source"], + return_value=[ + {"name": "document_name", "type": "string"}, + {"name": "source", "type": "string"}, + ], ), ): result, status = method(api) assert status == 200 - assert result["fields"] == ["title", "source"] + assert result["fields"] == [ + {"name": "document_name", "type": "string"}, + {"name": "source", "type": "string"}, + ] class TestDatasetMetadataBuiltInFieldActionApi: @@ -315,8 +327,8 @@ class TestDatasetMetadataBuiltInFieldActionApi: ): result, status = method(api, dataset_id, "enable") - assert status == 200 - assert result["result"] == "success" + assert status == 204 + assert result == "" class TestDocumentMetadataEditApi: @@ -359,5 +371,5 @@ class TestDocumentMetadataEditApi: ): result, status = method(api, dataset_id) - assert status == 200 - assert result["result"] == "success" + assert status == 204 + assert result == "" diff --git a/api/tests/unit_tests/controllers/console/test_extension.py b/api/tests/unit_tests/controllers/console/test_extension.py index 60a7ea5bb5..2a33ee12be 100644 --- a/api/tests/unit_tests/controllers/console/test_extension.py +++ b/api/tests/unit_tests/controllers/console/test_extension.py @@ -11,7 +11,7 @@ from flask.views import MethodView as FlaskMethodView _NEEDS_METHOD_VIEW_CLEANUP = False if not hasattr(builtins, "MethodView"): - builtins.MethodView = FlaskMethodView + builtins.__dict__["MethodView"] = FlaskMethodView _NEEDS_METHOD_VIEW_CLEANUP = True from constants import HIDDEN_VALUE @@ -22,7 +22,7 @@ from controllers.console.extension import ( ) if _NEEDS_METHOD_VIEW_CLEANUP: - del builtins.MethodView + del builtins.__dict__["MethodView"] from models.account import AccountStatus from models.api_based_extension import APIBasedExtension diff --git a/api/tests/unit_tests/controllers/service_api/dataset/test_metadata.py b/api/tests/unit_tests/controllers/service_api/dataset/test_metadata.py index b7e24f9201..5db87df0a2 100644 --- a/api/tests/unit_tests/controllers/service_api/dataset/test_metadata.py +++ b/api/tests/unit_tests/controllers/service_api/dataset/test_metadata.py @@ -67,7 +67,6 @@ class TestDatasetMetadataCreatePost: def _call_post(api, **kwargs): return _unwrap(api.post)(api, **kwargs) - @patch("controllers.service_api.dataset.metadata.marshal") @patch("controllers.service_api.dataset.metadata.MetadataService") @patch("controllers.service_api.dataset.metadata.DatasetService") @patch("controllers.service_api.dataset.metadata.current_user") @@ -76,7 +75,6 @@ class TestDatasetMetadataCreatePost: mock_current_user, mock_dataset_svc, mock_meta_svc, - mock_marshal, app: Flask, mock_tenant, mock_dataset, @@ -84,9 +82,8 @@ class TestDatasetMetadataCreatePost: """Test successful metadata creation.""" mock_dataset_svc.get_dataset.return_value = mock_dataset mock_dataset_svc.check_dataset_permission.return_value = None - mock_metadata = Mock() + mock_metadata = {"id": "meta-1", "type": "string", "name": "Author"} mock_meta_svc.create_metadata.return_value = mock_metadata - mock_marshal.return_value = {"id": "meta-1", "name": "Author"} with app.test_request_context( f"/datasets/{mock_dataset.id}/metadata", @@ -101,6 +98,7 @@ class TestDatasetMetadataCreatePost: ) assert status == 201 + assert response == {"id": "meta-1", "type": "string", "name": "Author"} mock_meta_svc.create_metadata.assert_called_once() @patch("controllers.service_api.dataset.metadata.DatasetService") @@ -143,7 +141,10 @@ class TestDatasetMetadataCreateGet: ): """Test successful metadata list retrieval.""" mock_dataset_svc.get_dataset.return_value = mock_dataset - mock_meta_svc.get_dataset_metadatas.return_value = [{"id": "m1"}] + mock_meta_svc.get_dataset_metadatas.return_value = { + "doc_metadata": [{"id": "m1", "name": "Author", "type": "string", "count": 0}], + "built_in_field_enabled": False, + } with app.test_request_context( f"/datasets/{mock_dataset.id}/metadata", @@ -156,6 +157,10 @@ class TestDatasetMetadataCreateGet: ) assert status == 200 + assert response == { + "doc_metadata": [{"id": "m1", "name": "Author", "type": "string", "count": 0}], + "built_in_field_enabled": False, + } @patch("controllers.service_api.dataset.metadata.DatasetService") def test_get_metadata_dataset_not_found( @@ -192,7 +197,6 @@ class TestDatasetMetadataServiceApiPatch: def _call_patch(api, **kwargs): return _unwrap(api.patch)(api, **kwargs) - @patch("controllers.service_api.dataset.metadata.marshal") @patch("controllers.service_api.dataset.metadata.MetadataService") @patch("controllers.service_api.dataset.metadata.DatasetService") @patch("controllers.service_api.dataset.metadata.current_user") @@ -201,7 +205,6 @@ class TestDatasetMetadataServiceApiPatch: mock_current_user, mock_dataset_svc, mock_meta_svc, - mock_marshal, app: Flask, mock_tenant, mock_dataset, @@ -210,8 +213,7 @@ class TestDatasetMetadataServiceApiPatch: metadata_id = str(uuid.uuid4()) mock_dataset_svc.get_dataset.return_value = mock_dataset mock_dataset_svc.check_dataset_permission.return_value = None - mock_meta_svc.update_metadata_name.return_value = Mock() - mock_marshal.return_value = {"id": metadata_id, "name": "New Name"} + mock_meta_svc.update_metadata_name.return_value = {"id": metadata_id, "type": "string", "name": "New Name"} with app.test_request_context( f"/datasets/{mock_dataset.id}/metadata/{metadata_id}", @@ -227,6 +229,7 @@ class TestDatasetMetadataServiceApiPatch: ) assert status == 200 + assert response == {"id": metadata_id, "type": "string", "name": "New Name"} mock_meta_svc.update_metadata_name.assert_called_once() @patch("controllers.service_api.dataset.metadata.DatasetService") @@ -357,7 +360,7 @@ class TestDatasetMetadataBuiltInFieldGet: ) assert status == 200 - assert "fields" in response + assert response == {"fields": [{"name": "source", "type": "string"}]} # --------------------------------------------------------------------------- diff --git a/packages/contracts/generated/api/console/datasets/orpc.gen.ts b/packages/contracts/generated/api/console/datasets/orpc.gen.ts index 4623d369c8..baec823590 100644 --- a/packages/contracts/generated/api/console/datasets/orpc.gen.ts +++ b/packages/contracts/generated/api/console/datasets/orpc.gen.ts @@ -495,16 +495,8 @@ export const init = { post: post6, } -/** - * Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate. - * - * @deprecated - */ export const get7 = oc .route({ - deprecated: true, - description: - 'Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate.', inputStructure: 'detailed', method: 'GET', operationId: 'getDatasetsMetadataBuiltIn', @@ -799,6 +791,7 @@ export const post11 = oc method: 'POST', operationId: 'postDatasetsByDatasetIdDocumentsMetadata', path: '/datasets/{dataset_id}/documents/metadata', + successStatus: 204, tags: ['console'], }) .input( @@ -1643,6 +1636,7 @@ export const post19 = oc method: 'POST', operationId: 'postDatasetsByDatasetIdMetadataBuiltInByAction', path: '/datasets/{dataset_id}/metadata/built-in/{action}', + successStatus: 204, tags: ['console'], }) .input(z.object({ params: zPostDatasetsByDatasetIdMetadataBuiltInByActionPath })) @@ -1668,16 +1662,8 @@ export const delete8 = oc .input(z.object({ params: zDeleteDatasetsByDatasetIdMetadataByMetadataIdPath })) .output(zDeleteDatasetsByDatasetIdMetadataByMetadataIdResponse) -/** - * Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate. - * - * @deprecated - */ export const patch10 = oc .route({ - deprecated: true, - description: - 'Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate.', inputStructure: 'detailed', method: 'PATCH', operationId: 'patchDatasetsByDatasetIdMetadataByMetadataId', @@ -1697,16 +1683,8 @@ export const byMetadataId = { patch: patch10, } -/** - * Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate. - * - * @deprecated - */ export const get29 = oc .route({ - deprecated: true, - description: - 'Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate.', inputStructure: 'detailed', method: 'GET', operationId: 'getDatasetsByDatasetIdMetadata', @@ -1716,20 +1694,13 @@ export const get29 = oc .input(z.object({ params: zGetDatasetsByDatasetIdMetadataPath })) .output(zGetDatasetsByDatasetIdMetadataResponse) -/** - * Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate. - * - * @deprecated - */ export const post20 = oc .route({ - deprecated: true, - description: - 'Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate.', inputStructure: 'detailed', method: 'POST', operationId: 'postDatasetsByDatasetIdMetadata', path: '/datasets/{dataset_id}/metadata', + successStatus: 201, tags: ['console'], }) .input( diff --git a/packages/contracts/generated/api/console/datasets/types.gen.ts b/packages/contracts/generated/api/console/datasets/types.gen.ts index 2d9f494515..92df8a52a5 100644 --- a/packages/contracts/generated/api/console/datasets/types.gen.ts +++ b/packages/contracts/generated/api/console/datasets/types.gen.ts @@ -140,6 +140,10 @@ export type DatasetAndDocumentResponse = { documents: Array } +export type DatasetMetadataBuiltInFieldsResponse = { + fields: Array +} + export type TextContentResponse = { content: string } @@ -291,11 +295,22 @@ export type HitTestingResponse = { records?: Array } +export type DatasetMetadataListResponse = { + built_in_field_enabled: boolean + doc_metadata: Array +} + export type MetadataArgs = { name: string type: 'number' | 'string' | 'time' } +export type DatasetMetadataResponse = { + id: string + name: string + type: string +} + export type MetadataUpdatePayload = { name: string } @@ -409,6 +424,11 @@ export type DatasetResponse = { permission?: string | null } +export type DatasetMetadataBuiltInFieldResponse = { + name: string + type: string +} + export type DocumentMetadataOperation = { document_id: string metadata_list: Array @@ -431,6 +451,13 @@ export type HitTestingRecord = { tsne_position?: unknown } +export type DatasetMetadataListItemResponse = { + count?: number + id: string + name: string + type: string +} + export type DatasetContent = { content?: string content_type?: string @@ -977,9 +1004,7 @@ export type GetDatasetsMetadataBuiltInData = { } export type GetDatasetsMetadataBuiltInResponses = { - 200: { - [key: string]: unknown - } + 200: DatasetMetadataBuiltInFieldsResponse } export type GetDatasetsMetadataBuiltInResponse @@ -1341,7 +1366,9 @@ export type PostDatasetsByDatasetIdDocumentsMetadataData = { } export type PostDatasetsByDatasetIdDocumentsMetadataResponses = { - 200: SimpleResultResponse + 204: { + [key: string]: never + } } export type PostDatasetsByDatasetIdDocumentsMetadataResponse @@ -2052,9 +2079,7 @@ export type GetDatasetsByDatasetIdMetadataData = { } export type GetDatasetsByDatasetIdMetadataResponses = { - 200: { - [key: string]: unknown - } + 200: DatasetMetadataListResponse } export type GetDatasetsByDatasetIdMetadataResponse @@ -2070,9 +2095,7 @@ export type PostDatasetsByDatasetIdMetadataData = { } export type PostDatasetsByDatasetIdMetadataResponses = { - 200: { - [key: string]: unknown - } + 201: DatasetMetadataResponse } export type PostDatasetsByDatasetIdMetadataResponse @@ -2089,7 +2112,9 @@ export type PostDatasetsByDatasetIdMetadataBuiltInByActionData = { } export type PostDatasetsByDatasetIdMetadataBuiltInByActionResponses = { - 200: SimpleResultResponse + 204: { + [key: string]: never + } } export type PostDatasetsByDatasetIdMetadataBuiltInByActionResponse @@ -2125,9 +2150,7 @@ export type PatchDatasetsByDatasetIdMetadataByMetadataIdData = { } export type PatchDatasetsByDatasetIdMetadataByMetadataIdResponses = { - 200: { - [key: string]: unknown - } + 200: DatasetMetadataResponse } export type PatchDatasetsByDatasetIdMetadataByMetadataIdResponse diff --git a/packages/contracts/generated/api/console/datasets/zod.gen.ts b/packages/contracts/generated/api/console/datasets/zod.gen.ts index 18d585a247..984608ffcc 100644 --- a/packages/contracts/generated/api/console/datasets/zod.gen.ts +++ b/packages/contracts/generated/api/console/datasets/zod.gen.ts @@ -204,6 +204,15 @@ export const zMetadataArgs = z.object({ type: z.enum(['number', 'string', 'time']), }) +/** + * DatasetMetadataResponse + */ +export const zDatasetMetadataResponse = z.object({ + id: z.string(), + name: z.string(), + type: z.string(), +}) + /** * MetadataUpdatePayload */ @@ -319,6 +328,21 @@ export const zDatasetResponse = z.object({ permission: z.string().nullish(), }) +/** + * DatasetMetadataBuiltInFieldResponse + */ +export const zDatasetMetadataBuiltInFieldResponse = z.object({ + name: z.string(), + type: z.string(), +}) + +/** + * DatasetMetadataBuiltInFieldsResponse + */ +export const zDatasetMetadataBuiltInFieldsResponse = z.object({ + fields: z.array(zDatasetMetadataBuiltInFieldResponse), +}) + /** * DocumentMetadataResponse */ @@ -368,6 +392,24 @@ export const zDatasetAndDocumentResponse = z.object({ documents: z.array(zDocumentResponse), }) +/** + * DatasetMetadataListItemResponse + */ +export const zDatasetMetadataListItemResponse = z.object({ + count: z.int().optional().default(0), + id: z.string(), + name: z.string(), + type: z.string(), +}) + +/** + * DatasetMetadataListResponse + */ +export const zDatasetMetadataListResponse = z.object({ + built_in_field_enabled: z.boolean(), + doc_metadata: z.array(zDatasetMetadataListItemResponse), +}) + export const zAppDetailKernel = z.object({ description: z.string().optional(), icon: z.string().optional(), @@ -966,9 +1008,9 @@ export const zPostDatasetsInitBody = zKnowledgeConfig export const zPostDatasetsInitResponse = zDatasetAndDocumentResponse /** - * Success + * Built-in fields retrieved successfully */ -export const zGetDatasetsMetadataBuiltInResponse = z.record(z.string(), z.unknown()) +export const zGetDatasetsMetadataBuiltInResponse = zDatasetMetadataBuiltInFieldsResponse /** * Success @@ -1149,9 +1191,9 @@ export const zPostDatasetsByDatasetIdDocumentsMetadataPath = z.object({ }) /** - * Success + * Documents metadata updated successfully */ -export const zPostDatasetsByDatasetIdDocumentsMetadataResponse = zSimpleResultResponse +export const zPostDatasetsByDatasetIdDocumentsMetadataResponse = z.record(z.string(), z.never()) export const zPatchDatasetsByDatasetIdDocumentsStatusByActionBatchPath = z.object({ action: z.string(), @@ -1566,9 +1608,9 @@ export const zGetDatasetsByDatasetIdMetadataPath = z.object({ }) /** - * Success + * Metadata retrieved successfully */ -export const zGetDatasetsByDatasetIdMetadataResponse = z.record(z.string(), z.unknown()) +export const zGetDatasetsByDatasetIdMetadataResponse = zDatasetMetadataListResponse export const zPostDatasetsByDatasetIdMetadataBody = zMetadataArgs @@ -1577,9 +1619,9 @@ export const zPostDatasetsByDatasetIdMetadataPath = z.object({ }) /** - * Success + * Metadata created successfully */ -export const zPostDatasetsByDatasetIdMetadataResponse = z.record(z.string(), z.unknown()) +export const zPostDatasetsByDatasetIdMetadataResponse = zDatasetMetadataResponse export const zPostDatasetsByDatasetIdMetadataBuiltInByActionPath = z.object({ action: z.string(), @@ -1587,9 +1629,12 @@ export const zPostDatasetsByDatasetIdMetadataBuiltInByActionPath = z.object({ }) /** - * Success + * Action completed successfully */ -export const zPostDatasetsByDatasetIdMetadataBuiltInByActionResponse = zSimpleResultResponse +export const zPostDatasetsByDatasetIdMetadataBuiltInByActionResponse = z.record( + z.string(), + z.never(), +) export const zDeleteDatasetsByDatasetIdMetadataByMetadataIdPath = z.object({ dataset_id: z.string(), @@ -1612,12 +1657,9 @@ export const zPatchDatasetsByDatasetIdMetadataByMetadataIdPath = z.object({ }) /** - * Success + * Metadata updated successfully */ -export const zPatchDatasetsByDatasetIdMetadataByMetadataIdResponse = z.record( - z.string(), - z.unknown(), -) +export const zPatchDatasetsByDatasetIdMetadataByMetadataIdResponse = zDatasetMetadataResponse export const zGetDatasetsByDatasetIdNotionSyncPath = z.object({ dataset_id: z.string(), diff --git a/packages/contracts/generated/api/service/orpc.gen.ts b/packages/contracts/generated/api/service/orpc.gen.ts index 56471b73b9..33d2c47361 100644 --- a/packages/contracts/generated/api/service/orpc.gen.ts +++ b/packages/contracts/generated/api/service/orpc.gen.ts @@ -1634,16 +1634,10 @@ export const byAction3 = { * Get all built-in metadata fields * * Get all built-in metadata fields - * - * Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate. - * - * @deprecated */ export const get15 = oc .route({ - deprecated: true, - description: - 'Get all built-in metadata fields\n\nGenerated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate.', + description: 'Get all built-in metadata fields', inputStructure: 'detailed', method: 'GET', operationId: 'getDatasetsByDatasetIdMetadataBuiltIn', @@ -1682,16 +1676,10 @@ export const delete7 = oc * Update metadata name * * Update metadata name - * - * Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate. - * - * @deprecated */ export const patch5 = oc .route({ - deprecated: true, - description: - 'Update metadata name\n\nGenerated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate.', + description: 'Update metadata name', inputStructure: 'detailed', method: 'PATCH', operationId: 'patchDatasetsByDatasetIdMetadataByMetadataId', @@ -1716,16 +1704,10 @@ export const byMetadataId = { * Get all metadata for a dataset * * Get all metadata for a dataset - * - * Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate. - * - * @deprecated */ export const get16 = oc .route({ - deprecated: true, - description: - 'Get all metadata for a dataset\n\nGenerated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate.', + description: 'Get all metadata for a dataset', inputStructure: 'detailed', method: 'GET', operationId: 'getDatasetsByDatasetIdMetadata', @@ -1740,16 +1722,10 @@ export const get16 = oc * Create metadata for a dataset * * Create metadata for a dataset - * - * Generated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate. - * - * @deprecated */ export const post28 = oc .route({ - deprecated: true, - description: - 'Create metadata for a dataset\n\nGenerated contract types may be inaccurate because backend OpenAPI annotations are incomplete. Do not migrate callers until the generated contract is accurate.', + description: 'Create metadata for a dataset', inputStructure: 'detailed', method: 'POST', operationId: 'postDatasetsByDatasetIdMetadata', diff --git a/packages/contracts/generated/api/service/types.gen.ts b/packages/contracts/generated/api/service/types.gen.ts index 9918edcb2a..101be40c8c 100644 --- a/packages/contracts/generated/api/service/types.gen.ts +++ b/packages/contracts/generated/api/service/types.gen.ts @@ -172,6 +172,37 @@ export type DatasetListQuery = { tag_ids?: Array } +export type DatasetMetadataActionResponse = { + result: string +} + +export type DatasetMetadataBuiltInFieldResponse = { + name: string + type: string +} + +export type DatasetMetadataBuiltInFieldsResponse = { + fields: Array +} + +export type DatasetMetadataListItemResponse = { + count?: number + id: string + name: string + type: string +} + +export type DatasetMetadataListResponse = { + built_in_field_enabled: boolean + doc_metadata: Array +} + +export type DatasetMetadataResponse = { + id: string + name: string + type: string +} + export type DatasetPermissionEnum = 'all_team_members' | 'only_me' | 'partial_members' export type DatasetUpdatePayload = { @@ -1666,7 +1697,7 @@ export type PostDatasetsByDatasetIdDocumentsMetadataError = PostDatasetsByDatasetIdDocumentsMetadataErrors[keyof PostDatasetsByDatasetIdDocumentsMetadataErrors] export type PostDatasetsByDatasetIdDocumentsMetadataResponses = { - 200: SimpleResultResponse + 200: DatasetMetadataActionResponse } export type PostDatasetsByDatasetIdDocumentsMetadataResponse @@ -2349,9 +2380,7 @@ export type GetDatasetsByDatasetIdMetadataError = GetDatasetsByDatasetIdMetadataErrors[keyof GetDatasetsByDatasetIdMetadataErrors] export type GetDatasetsByDatasetIdMetadataResponses = { - 200: { - [key: string]: unknown - } + 200: DatasetMetadataListResponse } export type GetDatasetsByDatasetIdMetadataResponse @@ -2379,9 +2408,7 @@ export type PostDatasetsByDatasetIdMetadataError = PostDatasetsByDatasetIdMetadataErrors[keyof PostDatasetsByDatasetIdMetadataErrors] export type PostDatasetsByDatasetIdMetadataResponses = { - 201: { - [key: string]: unknown - } + 201: DatasetMetadataResponse } export type PostDatasetsByDatasetIdMetadataResponse @@ -2406,9 +2433,7 @@ export type GetDatasetsByDatasetIdMetadataBuiltInError = GetDatasetsByDatasetIdMetadataBuiltInErrors[keyof GetDatasetsByDatasetIdMetadataBuiltInErrors] export type GetDatasetsByDatasetIdMetadataBuiltInResponses = { - 200: { - [key: string]: unknown - } + 200: DatasetMetadataBuiltInFieldsResponse } export type GetDatasetsByDatasetIdMetadataBuiltInResponse @@ -2437,7 +2462,7 @@ export type PostDatasetsByDatasetIdMetadataBuiltInByActionError = PostDatasetsByDatasetIdMetadataBuiltInByActionErrors[keyof PostDatasetsByDatasetIdMetadataBuiltInByActionErrors] export type PostDatasetsByDatasetIdMetadataBuiltInByActionResponses = { - 200: SimpleResultResponse + 200: DatasetMetadataActionResponse } export type PostDatasetsByDatasetIdMetadataBuiltInByActionResponse @@ -2497,9 +2522,7 @@ export type PatchDatasetsByDatasetIdMetadataByMetadataIdError = PatchDatasetsByDatasetIdMetadataByMetadataIdErrors[keyof PatchDatasetsByDatasetIdMetadataByMetadataIdErrors] export type PatchDatasetsByDatasetIdMetadataByMetadataIdResponses = { - 200: { - [key: string]: unknown - } + 200: DatasetMetadataResponse } export type PatchDatasetsByDatasetIdMetadataByMetadataIdResponse diff --git a/packages/contracts/generated/api/service/zod.gen.ts b/packages/contracts/generated/api/service/zod.gen.ts index f99d3f08a1..3bdaea3976 100644 --- a/packages/contracts/generated/api/service/zod.gen.ts +++ b/packages/contracts/generated/api/service/zod.gen.ts @@ -209,6 +209,55 @@ export const zDatasetListQuery = z.object({ tag_ids: z.array(z.string()).optional(), }) +/** + * DatasetMetadataActionResponse + */ +export const zDatasetMetadataActionResponse = z.object({ + result: z.string(), +}) + +/** + * DatasetMetadataBuiltInFieldResponse + */ +export const zDatasetMetadataBuiltInFieldResponse = z.object({ + name: z.string(), + type: z.string(), +}) + +/** + * DatasetMetadataBuiltInFieldsResponse + */ +export const zDatasetMetadataBuiltInFieldsResponse = z.object({ + fields: z.array(zDatasetMetadataBuiltInFieldResponse), +}) + +/** + * DatasetMetadataListItemResponse + */ +export const zDatasetMetadataListItemResponse = z.object({ + count: z.int().optional().default(0), + id: z.string(), + name: z.string(), + type: z.string(), +}) + +/** + * DatasetMetadataListResponse + */ +export const zDatasetMetadataListResponse = z.object({ + built_in_field_enabled: z.boolean(), + doc_metadata: z.array(zDatasetMetadataListItemResponse), +}) + +/** + * DatasetMetadataResponse + */ +export const zDatasetMetadataResponse = z.object({ + id: z.string(), + name: z.string(), + type: z.string(), +}) + /** * DatasetPermissionEnum */ @@ -1160,7 +1209,7 @@ export const zPostDatasetsByDatasetIdDocumentsMetadataPath = z.object({ /** * Documents metadata updated successfully */ -export const zPostDatasetsByDatasetIdDocumentsMetadataResponse = zSimpleResultResponse +export const zPostDatasetsByDatasetIdDocumentsMetadataResponse = zDatasetMetadataActionResponse export const zPatchDatasetsByDatasetIdDocumentsStatusByActionPath = z.object({ action: z.string(), @@ -1453,7 +1502,7 @@ export const zGetDatasetsByDatasetIdMetadataPath = z.object({ /** * Metadata retrieved successfully */ -export const zGetDatasetsByDatasetIdMetadataResponse = z.record(z.string(), z.unknown()) +export const zGetDatasetsByDatasetIdMetadataResponse = zDatasetMetadataListResponse export const zPostDatasetsByDatasetIdMetadataBody = zMetadataArgs @@ -1464,7 +1513,7 @@ export const zPostDatasetsByDatasetIdMetadataPath = z.object({ /** * Metadata created successfully */ -export const zPostDatasetsByDatasetIdMetadataResponse = z.record(z.string(), z.unknown()) +export const zPostDatasetsByDatasetIdMetadataResponse = zDatasetMetadataResponse export const zGetDatasetsByDatasetIdMetadataBuiltInPath = z.object({ dataset_id: z.string(), @@ -1473,7 +1522,7 @@ export const zGetDatasetsByDatasetIdMetadataBuiltInPath = z.object({ /** * Built-in fields retrieved successfully */ -export const zGetDatasetsByDatasetIdMetadataBuiltInResponse = z.record(z.string(), z.unknown()) +export const zGetDatasetsByDatasetIdMetadataBuiltInResponse = zDatasetMetadataBuiltInFieldsResponse export const zPostDatasetsByDatasetIdMetadataBuiltInByActionPath = z.object({ action: z.string(), @@ -1483,7 +1532,8 @@ export const zPostDatasetsByDatasetIdMetadataBuiltInByActionPath = z.object({ /** * Action completed successfully */ -export const zPostDatasetsByDatasetIdMetadataBuiltInByActionResponse = zSimpleResultResponse +export const zPostDatasetsByDatasetIdMetadataBuiltInByActionResponse + = zDatasetMetadataActionResponse export const zDeleteDatasetsByDatasetIdMetadataByMetadataIdPath = z.object({ dataset_id: z.string(), @@ -1508,10 +1558,7 @@ export const zPatchDatasetsByDatasetIdMetadataByMetadataIdPath = z.object({ /** * Metadata updated successfully */ -export const zPatchDatasetsByDatasetIdMetadataByMetadataIdResponse = z.record( - z.string(), - z.unknown(), -) +export const zPatchDatasetsByDatasetIdMetadataByMetadataIdResponse = zDatasetMetadataResponse export const zGetDatasetsByDatasetIdPipelineDatasourcePluginsPath = z.object({ dataset_id: z.string(),