feat: extend MetadataFieldDefinitionService with field_roles support [AC-MRS-01,02,03,06]
This commit is contained in:
parent
0db2971c73
commit
7fb7721974
|
|
@ -1,6 +1,7 @@
|
||||||
"""
|
"""
|
||||||
Metadata Field Definition Service.
|
Metadata Field Definition Service.
|
||||||
[AC-IDSMETA-13, AC-IDSMETA-14] 元数据字段定义管理服务,支持字段级状态治理。
|
[AC-IDSMETA-13, AC-IDSMETA-14] 元数据字段定义管理服务,支持字段级状态治理。
|
||||||
|
[AC-MRS-01, AC-MRS-02, AC-MRS-03, AC-MRS-06] 支持字段角色分层配置。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
@ -21,7 +22,9 @@ from app.models.entities import (
|
||||||
MetadataFieldStatus,
|
MetadataFieldStatus,
|
||||||
MetadataFieldType,
|
MetadataFieldType,
|
||||||
MetadataScope,
|
MetadataScope,
|
||||||
|
FieldRole,
|
||||||
)
|
)
|
||||||
|
from app.schemas.metadata import VALID_FIELD_ROLES
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
@ -42,14 +45,16 @@ class MetadataFieldDefinitionService:
|
||||||
tenant_id: str,
|
tenant_id: str,
|
||||||
status: str | None = None,
|
status: str | None = None,
|
||||||
scope: str | None = None,
|
scope: str | None = None,
|
||||||
|
role: str | None = None,
|
||||||
) -> list[MetadataFieldDefinition]:
|
) -> list[MetadataFieldDefinition]:
|
||||||
"""
|
"""
|
||||||
[AC-IDSMETA-13] 列出租户所有元数据字段定义
|
[AC-IDSMETA-13] [AC-MRS-06] 列出租户所有元数据字段定义
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
tenant_id: 租户 ID
|
tenant_id: 租户 ID
|
||||||
status: 按状态过滤(draft/active/deprecated)
|
status: 按状态过滤(draft/active/deprecated)
|
||||||
scope: 按适用范围过滤
|
scope: 按适用范围过滤
|
||||||
|
role: [AC-MRS-06] 按字段角色过滤
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
MetadataFieldDefinition 列表
|
MetadataFieldDefinition 列表
|
||||||
|
|
@ -66,6 +71,11 @@ class MetadataFieldDefinitionService:
|
||||||
cast(MetadataFieldDefinition.scope, JSONB).op('?')(scope)
|
cast(MetadataFieldDefinition.scope, JSONB).op('?')(scope)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if role:
|
||||||
|
stmt = stmt.where(
|
||||||
|
cast(MetadataFieldDefinition.field_roles, JSONB).op('?')(role)
|
||||||
|
)
|
||||||
|
|
||||||
stmt = stmt.order_by(col(MetadataFieldDefinition.created_at).desc())
|
stmt = stmt.order_by(col(MetadataFieldDefinition.created_at).desc())
|
||||||
|
|
||||||
result = await self._session.execute(stmt)
|
result = await self._session.execute(stmt)
|
||||||
|
|
@ -121,7 +131,7 @@ class MetadataFieldDefinitionService:
|
||||||
field_create: MetadataFieldDefinitionCreate,
|
field_create: MetadataFieldDefinitionCreate,
|
||||||
) -> MetadataFieldDefinition:
|
) -> MetadataFieldDefinition:
|
||||||
"""
|
"""
|
||||||
[AC-IDSMETA-13] 创建元数据字段定义
|
[AC-IDSMETA-13] [AC-MRS-01,02,03] 创建元数据字段定义
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
tenant_id: 租户 ID
|
tenant_id: 租户 ID
|
||||||
|
|
@ -149,6 +159,8 @@ class MetadataFieldDefinitionService:
|
||||||
field_create.field_key,
|
field_create.field_key,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self._validate_field_roles(field_create.field_roles)
|
||||||
|
|
||||||
field = MetadataFieldDefinition(
|
field = MetadataFieldDefinition(
|
||||||
tenant_id=tenant_id,
|
tenant_id=tenant_id,
|
||||||
field_key=field_create.field_key,
|
field_key=field_create.field_key,
|
||||||
|
|
@ -160,6 +172,7 @@ class MetadataFieldDefinitionService:
|
||||||
scope=field_create.scope,
|
scope=field_create.scope,
|
||||||
is_filterable=field_create.is_filterable,
|
is_filterable=field_create.is_filterable,
|
||||||
is_rank_feature=field_create.is_rank_feature,
|
is_rank_feature=field_create.is_rank_feature,
|
||||||
|
field_roles=field_create.field_roles or [],
|
||||||
status=field_create.status,
|
status=field_create.status,
|
||||||
version=1,
|
version=1,
|
||||||
)
|
)
|
||||||
|
|
@ -168,8 +181,8 @@ class MetadataFieldDefinitionService:
|
||||||
await self._session.flush()
|
await self._session.flush()
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
f"[AC-IDSMETA-13] Created field definition: tenant={tenant_id}, "
|
f"[AC-IDSMETA-13] [AC-MRS-01] Created field definition: tenant={tenant_id}, "
|
||||||
f"field_key={field.field_key}, status={field.status}"
|
f"field_key={field.field_key}, status={field.status}, field_roles={field.field_roles}"
|
||||||
)
|
)
|
||||||
|
|
||||||
return field
|
return field
|
||||||
|
|
@ -437,6 +450,28 @@ class MetadataFieldDefinitionService:
|
||||||
f"字段 '{field_key}' 的 options 存在重复值"
|
f"字段 '{field_key}' 的 options 存在重复值"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _validate_field_roles(
|
||||||
|
self,
|
||||||
|
field_roles: list[str] | None,
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
[AC-MRS-01,02,03] 验证字段角色配置的有效性
|
||||||
|
|
||||||
|
Args:
|
||||||
|
field_roles: 字段角色列表
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ValueError: 如果包含无效的字段角色
|
||||||
|
"""
|
||||||
|
if not field_roles:
|
||||||
|
return
|
||||||
|
|
||||||
|
for role in field_roles:
|
||||||
|
if role not in VALID_FIELD_ROLES:
|
||||||
|
raise ValueError(
|
||||||
|
f"无效的字段角色 '{role}',有效角色为: {VALID_FIELD_ROLES}"
|
||||||
|
)
|
||||||
|
|
||||||
async def get_field_definitions_map(
|
async def get_field_definitions_map(
|
||||||
self,
|
self,
|
||||||
tenant_id: str,
|
tenant_id: str,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue