Files
Investidor-V2/docs/investmoz/education/openapi.proposed.json
T
nala 250ac35fd1
tests / ci (push) Canceled after 0s
first commit
2026-09-28 10:01:09 +02:00

871 lines
32 KiB
JSON

{
"openapi": "3.1.0",
"info": {
"title": "InvestMoz Education — contrato proposto do núcleo de procura",
"version": "0.1.0-proposal",
"description": "Não implementado. Bloqueios B01/B02/B03. Não usar para gerar clientes de produção. Demais endpoints na especificação estão pendentes de contratos detalhados."
},
"x-artifact-status": "Proposta",
"x-authentication-pending": {
"target": "OAuth 2.0 e OpenID Connect",
"issuer": "Pendente de validação",
"scopes": "Propostos; não configurados",
"warning": "Bearer descreve transporte; não demonstra servidor OAuth/OIDC existente."
},
"security": [
{
"ProposedAccessToken": []
}
],
"paths": {
"/api/v1/education/labour-demands": {
"get": {
"operationId": "educationListLabourDemands",
"x-rf": ["RF-EDU-002", "RF-EDU-015"],
"x-required-scopes": ["education:read"],
"parameters": [
{
"$ref": "#/components/parameters/Correlation"
},
{
"name": "cursor",
"in": "query",
"schema": {
"type": "string",
"maxLength": 2000
}
},
{
"name": "limit",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 20
}
},
{
"name": "territory_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"responses": {
"200": {
"description": "Resultado proposto",
"headers": {
"X-Correlation-Id": {
"schema": {
"type": "string",
"format": "uuid"
}
},
"ETag": {
"schema": {
"type": "string"
},
"description": "ETag forte e opaco da versão"
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DemandPage"
}
}
}
},
"400": {
"$ref": "#/components/responses/Problem"
},
"401": {
"$ref": "#/components/responses/Problem"
},
"403": {
"$ref": "#/components/responses/Problem"
},
"404": {
"$ref": "#/components/responses/Problem"
},
"409": {
"$ref": "#/components/responses/Problem"
},
"412": {
"$ref": "#/components/responses/Problem"
},
"422": {
"$ref": "#/components/responses/Problem"
},
"428": {
"$ref": "#/components/responses/Problem"
},
"429": {
"$ref": "#/components/responses/Problem"
},
"503": {
"$ref": "#/components/responses/Problem"
}
}
},
"post": {
"operationId": "educationSubmitLabourDemand",
"x-rf": ["RF-EDU-002", "RF-EDU-009"],
"x-required-scopes": ["education:demand:submit"],
"parameters": [
{
"$ref": "#/components/parameters/Correlation"
},
{
"$ref": "#/components/parameters/Idempotency"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DemandInput"
}
}
}
},
"responses": {
"201": {
"description": "Resultado proposto",
"headers": {
"X-Correlation-Id": {
"schema": {
"type": "string",
"format": "uuid"
}
},
"ETag": {
"schema": {
"type": "string"
},
"description": "ETag forte e opaco da versão"
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Demand"
}
}
}
},
"400": {
"$ref": "#/components/responses/Problem"
},
"401": {
"$ref": "#/components/responses/Problem"
},
"403": {
"$ref": "#/components/responses/Problem"
},
"404": {
"$ref": "#/components/responses/Problem"
},
"409": {
"$ref": "#/components/responses/Problem"
},
"412": {
"$ref": "#/components/responses/Problem"
},
"422": {
"$ref": "#/components/responses/Problem"
},
"428": {
"$ref": "#/components/responses/Problem"
},
"429": {
"$ref": "#/components/responses/Problem"
},
"503": {
"$ref": "#/components/responses/Problem"
}
}
}
},
"/api/v1/education/labour-demands/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"get": {
"operationId": "educationGetLabourDemand",
"x-rf": ["RF-EDU-002"],
"x-required-scopes": ["education:read"],
"parameters": [
{
"$ref": "#/components/parameters/Correlation"
}
],
"responses": {
"200": {
"description": "Resultado proposto",
"headers": {
"X-Correlation-Id": {
"schema": {
"type": "string",
"format": "uuid"
}
},
"ETag": {
"schema": {
"type": "string"
},
"description": "ETag forte e opaco da versão"
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Demand"
}
}
}
},
"400": {
"$ref": "#/components/responses/Problem"
},
"401": {
"$ref": "#/components/responses/Problem"
},
"403": {
"$ref": "#/components/responses/Problem"
},
"404": {
"$ref": "#/components/responses/Problem"
},
"409": {
"$ref": "#/components/responses/Problem"
},
"412": {
"$ref": "#/components/responses/Problem"
},
"422": {
"$ref": "#/components/responses/Problem"
},
"428": {
"$ref": "#/components/responses/Problem"
},
"429": {
"$ref": "#/components/responses/Problem"
},
"503": {
"$ref": "#/components/responses/Problem"
}
}
},
"patch": {
"operationId": "educationReviseLabourDemand",
"x-rf": ["RF-EDU-009"],
"x-required-scopes": ["education:demand:submit"],
"description": "Alteração cria nova versão e invalida validação anterior; estado é gerido pelo servidor.",
"parameters": [
{
"$ref": "#/components/parameters/Correlation"
},
{
"$ref": "#/components/parameters/Match"
},
{
"$ref": "#/components/parameters/Idempotency"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DemandPatch"
}
}
}
},
"responses": {
"200": {
"description": "Resultado proposto",
"headers": {
"X-Correlation-Id": {
"schema": {
"type": "string",
"format": "uuid"
}
},
"ETag": {
"schema": {
"type": "string"
},
"description": "ETag forte e opaco da versão"
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Demand"
}
}
}
},
"400": {
"$ref": "#/components/responses/Problem"
},
"401": {
"$ref": "#/components/responses/Problem"
},
"403": {
"$ref": "#/components/responses/Problem"
},
"404": {
"$ref": "#/components/responses/Problem"
},
"409": {
"$ref": "#/components/responses/Problem"
},
"412": {
"$ref": "#/components/responses/Problem"
},
"422": {
"$ref": "#/components/responses/Problem"
},
"428": {
"$ref": "#/components/responses/Problem"
},
"429": {
"$ref": "#/components/responses/Problem"
},
"503": {
"$ref": "#/components/responses/Problem"
}
}
}
},
"/api/v1/education/labour-demands/{id}/decisions": {
"parameters": [
{
"$ref": "#/components/parameters/Id"
}
],
"post": {
"operationId": "educationDecideLabourDemand",
"x-rf": ["RF-EDU-009", "RF-EDU-032"],
"x-required-scopes": ["education:demand:review"],
"description": "Revisor distinto e mandato válido; não confere acreditação. Versão deve coincidir com If-Match.",
"parameters": [
{
"$ref": "#/components/parameters/Correlation"
},
{
"$ref": "#/components/parameters/Match"
},
{
"$ref": "#/components/parameters/Idempotency"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DecisionInput"
}
}
}
},
"responses": {
"201": {
"description": "Resultado proposto",
"headers": {
"X-Correlation-Id": {
"schema": {
"type": "string",
"format": "uuid"
}
},
"ETag": {
"schema": {
"type": "string"
},
"description": "ETag forte e opaco da versão"
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Demand"
}
}
}
},
"400": {
"$ref": "#/components/responses/Problem"
},
"401": {
"$ref": "#/components/responses/Problem"
},
"403": {
"$ref": "#/components/responses/Problem"
},
"404": {
"$ref": "#/components/responses/Problem"
},
"409": {
"$ref": "#/components/responses/Problem"
},
"412": {
"$ref": "#/components/responses/Problem"
},
"422": {
"$ref": "#/components/responses/Problem"
},
"428": {
"$ref": "#/components/responses/Problem"
},
"429": {
"$ref": "#/components/responses/Problem"
},
"503": {
"$ref": "#/components/responses/Problem"
}
}
}
}
},
"components": {
"securitySchemes": {
"ProposedAccessToken": {
"type": "http",
"scheme": "bearer",
"description": "Proposta de access token validado; configuração OAuth/OIDC pendente."
}
},
"parameters": {
"Id": {
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
},
"Correlation": {
"name": "X-Correlation-Id",
"in": "header",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Servidor gera se ausente; nunca confere autorização."
},
"Idempotency": {
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Escopo actor + operação + recurso; payload diferente com mesma chave devolve 409."
},
"Match": {
"name": "If-Match",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 1
},
"description": "ETag forte exacto; ausente 428, desactualizado 412; wildcard não aceite."
}
},
"responses": {
"Problem": {
"description": "Erro sanitizado",
"headers": {
"X-Correlation-Id": {
"schema": {
"type": "string",
"format": "uuid"
}
}
},
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/Problem"
}
}
}
}
},
"schemas": {
"DemandInput": {
"type": "object",
"additionalProperties": false,
"properties": {
"occupation_id": {
"type": "string",
"format": "uuid"
},
"employer_id": {
"type": "string",
"format": "uuid"
},
"territory_id": {
"type": "string",
"format": "uuid"
},
"project_id": {
"type": "string",
"format": "uuid"
},
"cluster_id": {
"type": "string",
"format": "uuid"
},
"corridor_id": {
"type": "string",
"format": "uuid"
},
"value_chain_id": {
"type": "string",
"format": "uuid"
},
"qualification_level_id": {
"type": "string",
"format": "uuid"
},
"skill_ids": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "string",
"format": "uuid"
}
},
"quantity": {
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"country_code": {
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "Validar pertença ISO 3166-1 alpha-2, não apenas regex."
},
"activity": {
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"phase": {
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"workplace": {
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"nature": {
"type": "string",
"enum": ["permanent", "temporary", "seasonal"]
},
"hiring_date": {
"type": "string",
"format": "date"
},
"end_date": {
"type": ["string", "null"],
"format": "date"
},
"source_id": {
"type": "string",
"format": "uuid"
},
"reference_date": {
"type": "string",
"format": "date"
},
"valid_until": {
"type": "string",
"format": "date"
},
"evidence_document_id": {
"type": "string",
"format": "uuid"
},
"classification": {
"type": "string",
"enum": ["internal", "confidential", "restricted"]
}
},
"required": [
"occupation_id",
"employer_id",
"territory_id",
"qualification_level_id",
"skill_ids",
"quantity",
"country_code",
"activity",
"phase",
"workplace",
"nature",
"hiring_date",
"source_id",
"reference_date",
"valid_until",
"evidence_document_id",
"classification"
],
"anyOf": [
{
"required": ["project_id"]
},
{
"required": ["cluster_id"]
},
{
"required": ["corridor_id"]
}
],
"description": "Proposta; validar datas, mandato, contexto, fontes e taxonomias no serviço. Submissor não fornece estado validado."
},
"DemandPatch": {
"type": "object",
"minProperties": 1,
"additionalProperties": false,
"properties": {
"occupation_id": {
"type": "string",
"format": "uuid"
},
"employer_id": {
"type": "string",
"format": "uuid"
},
"territory_id": {
"type": "string",
"format": "uuid"
},
"project_id": {
"type": "string",
"format": "uuid"
},
"cluster_id": {
"type": "string",
"format": "uuid"
},
"corridor_id": {
"type": "string",
"format": "uuid"
},
"value_chain_id": {
"type": "string",
"format": "uuid"
},
"qualification_level_id": {
"type": "string",
"format": "uuid"
},
"skill_ids": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "string",
"format": "uuid"
}
},
"quantity": {
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"country_code": {
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "Validar pertença ISO 3166-1 alpha-2, não apenas regex."
},
"activity": {
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"phase": {
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"workplace": {
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"nature": {
"type": "string",
"enum": ["permanent", "temporary", "seasonal"]
},
"hiring_date": {
"type": "string",
"format": "date"
},
"end_date": {
"type": ["string", "null"],
"format": "date"
},
"source_id": {
"type": "string",
"format": "uuid"
},
"reference_date": {
"type": "string",
"format": "date"
},
"valid_until": {
"type": "string",
"format": "date"
},
"evidence_document_id": {
"type": "string",
"format": "uuid"
},
"classification": {
"type": "string",
"enum": ["internal", "confidential", "restricted"]
}
},
"description": "Validar o resultado completo após aplicar PATCH; não aceitar alteração de estado por este contrato."
},
"Demand": {
"type": "object",
"additionalProperties": false,
"required": ["id", "version", "state", "data", "updated_at"],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"version": {
"type": "integer",
"minimum": 1
},
"state": {
"type": "string",
"enum": [
"submitted",
"in_review",
"validated",
"rejected",
"expired",
"suspended"
]
},
"data": {
"$ref": "#/components/schemas/DemandInput"
},
"updated_at": {
"type": "string",
"format": "date-time"
}
}
},
"DemandPage": {
"type": "object",
"additionalProperties": false,
"required": ["data", "next_cursor"],
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Demand"
}
},
"next_cursor": {
"type": ["string", "null"]
}
}
},
"DecisionInput": {
"type": "object",
"additionalProperties": false,
"required": [
"decision",
"reason",
"evidence_document_id",
"authority_id"
],
"properties": {
"decision": {
"type": "string",
"enum": ["validate", "reject", "return_for_correction"]
},
"reason": {
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"evidence_document_id": {
"type": "string",
"format": "uuid"
},
"authority_id": {
"type": "string",
"format": "uuid"
}
}
},
"Problem": {
"type": "object",
"required": ["type", "title", "status", "correlation_id"],
"properties": {
"type": {
"type": "string",
"format": "uri-reference"
},
"title": {
"type": "string"
},
"status": {
"type": "integer",
"minimum": 400,
"maximum": 599
},
"detail": {
"type": "string"
},
"instance": {
"type": "string",
"format": "uri-reference"
},
"correlation_id": {
"type": "string",
"format": "uuid"
},
"errors": {
"type": "object",
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
}