A arquitetura atual do praxis-metadata-starter nao deve
mais ser explicada como “DTO anotado gera CRUD”. O baseline canonico
evoluiu para um sistema resource-oriented que publica:
x-ui/schemas/filtered como contrato estrutural/schemas/catalog como catalogo documental/schemas/surfaces e /schemas/actions como
discovery semantico/{resource}/capabilities e
/{resource}/{id}/capabilities como snapshot agregadoRestApiResponse com Spring HATEOAS efetivoflowchart LR
host["Spring Boot host"] --> auto["PraxisMetadataAutoConfiguration"]
auto --> openapi["OpenAPI enriched with x-ui"]
openapi --> filtered["/schemas/filtered"]
openapi --> catalog["/schemas/catalog"]
openapi --> surfaces["/schemas/surfaces"]
openapi --> actions["/schemas/actions"]
surfaces --> caps["/{resource}/capabilities"]
actions --> caps
filtered --> runtime["praxis-ui-angular runtime"]
catalog --> docs["docs, examples, RAG"]
caps --> semantic["semantic clients and assistants"]
O contrato estrutural e o discovery semantico tem papeis diferentes:
/schemas/filtered e a superficie lida pelo runtime para
renderizacao/schemas/catalog organiza exemplos, links e sumarios
para exploracao/schemas/surfaces e /schemas/actions
publicam catalogos semanticos/{resource}/capabilities agrega o que pode ser feito
agora sem virar um schema alternativoPara aplicacoes novas, o baseline correto e:
AbstractResourceControllerAbstractReadOnlyResourceControllerAbstractBaseResourceServiceAbstractReadOnlyResourceServiceResourceMapper@ApiResource(value = ..., resourceKey = ...)O modelo esperado separa:
ResponseDTOCreateDTOUpdateDTOFilterDTO@UISchema continua relevante para metadados de campo,
mas ele ja nao descreve sozinho a arquitetura publica do starter.
PraxisMetadataAutoConfigurationOpenApiUiSchemaAutoConfigurationDynamicSwaggerConfigEssas pecas registram controllers, resolvers, grouped OpenAPI e o suporte de docs/discovery.
CustomOpenApiResolverOpenApiGroupResolverOpenApiDocsSupportAqui o starter transforma DTOs, Bean Validation e metadata de recurso
em OpenAPI enriquecido e grupos canonicamente resolvidos por
path.
ApiDocsControllerDomainCatalogControllerSurfaceCatalogControllerActionCatalogControllerEsses controllers nao sao equivalentes entre si:
ApiDocsController publica o payload estruturalDomainCatalogController publica o catalogo
documentalSurfaceCatalogController publica surfaces canonicas do
recursoActionCatalogController publica workflow actions
canonicamente anotadas@ApiResource@ResourceIntent@UiSurface@WorkflowActionAqui a arquitetura sai do antigo “CRUD com metadata” e passa para semantica de recurso, experiencia e acao de negocio.
sequenceDiagram
participant DTO as DTOs + validation
participant Resolver as CustomOpenApiResolver
participant OpenAPI as OpenAPI document
participant Docs as ApiDocsController
participant Runtime as Angular runtime
DTO->>Resolver: field metadata, validation, resource semantics
Resolver->>OpenAPI: persist x-ui and operation metadata
Docs->>OpenAPI: resolve best group for the requested path
Docs->>Docs: filter request or response schema
Docs->>Docs: inject x-ui.resource and cache headers
Docs-->>Runtime: structural payload for rendering
Esse fluxo ainda e o centro do runtime oficial.
O que mudou foi a semantica ao redor dele:
x-ui.resource.capabilities nao e mais o unico discovery
relevantesequenceDiagram
participant Resource as @ApiResource
participant Surface as @UiSurface
participant Action as @WorkflowAction
participant Catalogs as surface/action catalogs
participant Capabilities as capability resolver
participant Client as semantic client
Resource->>Catalogs: publish automatic resource surfaces
Surface->>Catalogs: publish explicit UX surfaces
Action->>Catalogs: publish explicit workflow actions
Catalogs->>Capabilities: contribute semantic entries
Capabilities-->>Client: aggregate current snapshot
Regras importantes:
surfaces automaticas continuam existindo para o recurso
canonicoactions dependem de workflow explicito; ausencia pode
resultar em 404capabilities agrega ausencia de surfaces e
actions como listas vaziasITEM em catalogos globais sao discovery-only
ate existir resourceIdHATEOAS nao e detalhe de serializacao.
Ele compoe a semantica publica em:
_links de RestApiResponseQuando o host desliga HATEOAS, a plataforma perde links, nao a semantica canonica de recurso e discovery.
praxis-api-quickstartE o host operacional de referencia. Ele prova:
path/schemas/catalog/schemas/filteredpraxis-ui-angularE o runtime oficial. Ele consome:
/schemas/filteredETagX-Schema-Hashx-ui.resource.idFieldEle pode tambem usar discovery semantico novo, mas o contrato estrutural segue sendo a base do runtime.
Nao explicar o starter como se ele fosse:
@UISchema +
AbstractCrudController/schemas/catalog substitui
/schemas/filteredEssas leituras ficaram historicamente incompletas.