@semacode/cli 1.5.11 → 1.5.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -1
- package/dist/index.js +446 -32
- package/package.json +23 -32
- package/semacode-cli-1.3.1.tgz +0 -0
- package/src/angular-consumer-standalone.ts +312 -0
- package/src/cpp-symbols.ts +82 -0
- package/src/docs.ts +535 -0
- package/src/dotnet-http.ts +355 -0
- package/src/drift.ts +4933 -0
- package/src/go-http.ts +118 -0
- package/src/importador.ts +3891 -0
- package/src/index.ts +5641 -0
- package/src/java-http.ts +247 -0
- package/src/lua-symbols.ts +114 -0
- package/src/php-symbols.ts +462 -0
- package/src/projeto.ts +862 -0
- package/src/python-http.ts +258 -0
- package/src/rust-http.ts +125 -0
- package/src/tipos.ts +24 -0
- package/src/typescript-http.ts +1076 -0
- package/tsconfig.json +20 -0
- package/AGENTS.md +0 -272
- package/LICENSE +0 -22
- package/SEMA_BRIEF.curto.txt +0 -9
- package/SEMA_BRIEF.md +0 -63
- package/SEMA_BRIEF.micro.txt +0 -7
- package/SEMA_INDEX.json +0 -799
- package/dist/angular-consumer-standalone.d.ts +0 -6
- package/dist/angular-consumer-standalone.js.map +0 -1
- package/dist/cpp-symbols.d.ts +0 -10
- package/dist/cpp-symbols.js.map +0 -1
- package/dist/docs.d.ts +0 -56
- package/dist/docs.js.map +0 -1
- package/dist/dotnet-http.d.ts +0 -23
- package/dist/dotnet-http.js.map +0 -1
- package/dist/drift.d.ts +0 -225
- package/dist/drift.js.map +0 -1
- package/dist/go-http.d.ts +0 -23
- package/dist/go-http.js.map +0 -1
- package/dist/importador.d.ts +0 -31
- package/dist/importador.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js.map +0 -1
- package/dist/java-http.d.ts +0 -23
- package/dist/java-http.js.map +0 -1
- package/dist/lua-symbols.d.ts +0 -10
- package/dist/lua-symbols.js.map +0 -1
- package/dist/php-symbols.d.ts +0 -24
- package/dist/php-symbols.js.map +0 -1
- package/dist/projeto.d.ts +0 -53
- package/dist/projeto.js.map +0 -1
- package/dist/python-http.d.ts +0 -23
- package/dist/python-http.js.map +0 -1
- package/dist/rust-http.d.ts +0 -23
- package/dist/rust-http.js.map +0 -1
- package/dist/tipos.d.ts +0 -3
- package/dist/tipos.js.map +0 -1
- package/dist/typescript-http.d.ts +0 -35
- package/dist/typescript-http.js.map +0 -1
- package/docs/AGENT_STARTER.md +0 -102
- package/docs/cli.md +0 -110
- package/docs/como-ensinar-a-sema-para-ia.md +0 -149
- package/docs/deploy.md +0 -70
- package/docs/documentacao.md +0 -63
- package/docs/env.md +0 -56
- package/docs/extensao-vscode.md +0 -45
- package/docs/fluxo-pratico-ia-sema.md +0 -177
- package/docs/instalacao-e-primeiro-uso.md +0 -112
- package/docs/integracao-com-ia.md +0 -101
- package/docs/mcp.md +0 -53
- package/docs/pagamento-ponta-a-ponta.md +0 -155
- package/docs/persistencia-vendor-first.md +0 -145
- package/docs/prompt-base-ia-sema.md +0 -104
- package/docs/rollback.md +0 -47
- package/docs/sintaxe.md +0 -244
- package/exemplos/agendamento.sema +0 -106
- package/exemplos/assinatura.sema +0 -136
- package/exemplos/auditoria.sema +0 -88
- package/exemplos/autenticacao.sema +0 -125
- package/exemplos/automacao.sema +0 -107
- package/exemplos/cadastro_usuario.sema +0 -54
- package/exemplos/calculadora.sema +0 -78
- package/exemplos/crud_simples.sema +0 -89
- package/exemplos/estoque.sema +0 -126
- package/exemplos/exportacao.sema +0 -94
- package/exemplos/fila.sema +0 -131
- package/exemplos/integracao_externa.sema +0 -94
- package/exemplos/multi_tenant.sema +0 -140
- package/exemplos/notificacao.sema +0 -98
- package/exemplos/operacao_estrategia.sema +0 -402
- package/exemplos/pagamento.sema +0 -222
- package/exemplos/pagamento_dominio.sema +0 -35
- package/exemplos/pedido.sema +0 -119
- package/exemplos/permissao.sema +0 -121
- package/exemplos/persistencia_vendor_first.sema +0 -86
- package/exemplos/relatorio.sema +0 -93
- package/exemplos/testes_embutidos.sema +0 -45
- package/exemplos/tratamento_erro.sema +0 -157
- package/exemplos/upload_arquivo.sema +0 -93
- package/exemplos/webhook.sema +0 -96
- package/llms-full.txt +0 -34
- package/llms.txt +0 -17
- package/node_modules/@sema/gerador-css/dist/index.d.ts +0 -3
- package/node_modules/@sema/gerador-css/dist/index.js +0 -592
- package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-css/package.json +0 -7
- package/node_modules/@sema/gerador-dart/dist/index.d.ts +0 -3
- package/node_modules/@sema/gerador-dart/dist/index.js +0 -44
- package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-dart/package.json +0 -7
- package/node_modules/@sema/gerador-html/dist/index.d.ts +0 -3
- package/node_modules/@sema/gerador-html/dist/index.js +0 -163
- package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-html/package.json +0 -7
- package/node_modules/@sema/gerador-javascript/dist/index.d.ts +0 -3
- package/node_modules/@sema/gerador-javascript/dist/index.js +0 -421
- package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-javascript/package.json +0 -7
- package/node_modules/@sema/gerador-lua/dist/index.d.ts +0 -3
- package/node_modules/@sema/gerador-lua/dist/index.js +0 -328
- package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-lua/package.json +0 -7
- package/node_modules/@sema/gerador-python/dist/index.d.ts +0 -6
- package/node_modules/@sema/gerador-python/dist/index.js +0 -729
- package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-python/package.json +0 -7
- package/node_modules/@sema/gerador-typescript/dist/index.d.ts +0 -6
- package/node_modules/@sema/gerador-typescript/dist/index.js +0 -793
- package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
- package/node_modules/@sema/gerador-typescript/package.json +0 -7
- package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +0 -123
- package/node_modules/@sema/nucleo/dist/ast/tipos.js +0 -2
- package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +0 -21
- package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +0 -12
- package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +0 -9
- package/node_modules/@sema/nucleo/dist/formatador/index.js +0 -460
- package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/index.d.ts +0 -35
- package/node_modules/@sema/nucleo/dist/index.js +0 -96
- package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +0 -5
- package/node_modules/@sema/nucleo/dist/ir/conversor.js +0 -883
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +0 -345
- package/node_modules/@sema/nucleo/dist/ir/modelos.js +0 -2
- package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +0 -7
- package/node_modules/@sema/nucleo/dist/lexer/lexer.js +0 -122
- package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +0 -8
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -61
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +0 -9
- package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -771
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/persistencia/contratos.d.ts +0 -39
- package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +0 -294
- package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +0 -57
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +0 -1617
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +0 -104
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +0 -445
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +0 -91
- package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +0 -258
- package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
- package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +0 -2
- package/node_modules/@sema/nucleo/dist/util/arquivos.js +0 -25
- package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
- package/node_modules/@sema/nucleo/package.json +0 -7
- package/node_modules/@sema/padroes/dist/index.d.ts +0 -25
- package/node_modules/@sema/padroes/dist/index.js +0 -316
- package/node_modules/@sema/padroes/dist/index.js.map +0 -1
- package/node_modules/@sema/padroes/package.json +0 -7
package/exemplos/fila.sema
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
module exemplos.fila {
|
|
2
|
-
docs {
|
|
3
|
-
resumo: "Processamento de jobs em fila com retentativa e dead letter."
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
entity Job {
|
|
7
|
-
fields {
|
|
8
|
-
id: Id
|
|
9
|
-
tipo: Texto
|
|
10
|
-
payload: Objeto
|
|
11
|
-
status: Texto
|
|
12
|
-
tentativas: Inteiro
|
|
13
|
-
max_tentativas: Inteiro
|
|
14
|
-
agendado_para: Timestamp
|
|
15
|
-
processado_em: Timestamp
|
|
16
|
-
erro: Texto
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
task enfileirar_job {
|
|
21
|
-
input {
|
|
22
|
-
tipo: Texto required
|
|
23
|
-
payload: Objeto required
|
|
24
|
-
agendado_para: Timestamp
|
|
25
|
-
max_tentativas: Inteiro
|
|
26
|
-
}
|
|
27
|
-
output {
|
|
28
|
-
job_id: Id
|
|
29
|
-
}
|
|
30
|
-
rules {
|
|
31
|
-
tipo deve_ser preenchido
|
|
32
|
-
max_tentativas <= 10
|
|
33
|
-
}
|
|
34
|
-
effects {
|
|
35
|
-
persistencia Job
|
|
36
|
-
evento job_enfileirado criticidade = baixa
|
|
37
|
-
auditoria enfileiramento_job
|
|
38
|
-
}
|
|
39
|
-
state ciclo_job {
|
|
40
|
-
transitions {
|
|
41
|
-
CRIADO -> PENDENTE
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
guarantees {
|
|
45
|
-
job_id existe
|
|
46
|
-
}
|
|
47
|
-
error {
|
|
48
|
-
tipo_invalido: "Tipo de job nao registrado."
|
|
49
|
-
fila_cheia: "Fila atingiu capacidade maxima."
|
|
50
|
-
}
|
|
51
|
-
tests {
|
|
52
|
-
caso "enfileira job valido" {
|
|
53
|
-
given { tipo: "envio_email" payload: {destinatario: "a@b.com"} }
|
|
54
|
-
expect { sucesso: verdadeiro }
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
task processar_job {
|
|
60
|
-
input {
|
|
61
|
-
job_id: Id required
|
|
62
|
-
}
|
|
63
|
-
output {
|
|
64
|
-
resultado: Objeto
|
|
65
|
-
}
|
|
66
|
-
rules {
|
|
67
|
-
job_id deve_ser valido
|
|
68
|
-
job.status == PENDENTE
|
|
69
|
-
}
|
|
70
|
-
effects {
|
|
71
|
-
persistencia Job
|
|
72
|
-
evento job_processado criticidade = baixa
|
|
73
|
-
auditoria processamento_job
|
|
74
|
-
}
|
|
75
|
-
state ciclo_job {
|
|
76
|
-
transitions {
|
|
77
|
-
PENDENTE -> EM_EXECUCAO
|
|
78
|
-
EM_EXECUCAO -> CONCLUIDO
|
|
79
|
-
EM_EXECUCAO -> FALHOU
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
guarantees {
|
|
83
|
-
resultado existe
|
|
84
|
-
}
|
|
85
|
-
error {
|
|
86
|
-
job_nao_encontrado: "Job nao localizado na fila."
|
|
87
|
-
job_ja_processado: "Este job ja foi executado."
|
|
88
|
-
execucao_falhou: "Falha durante a execucao do job."
|
|
89
|
-
}
|
|
90
|
-
tests {
|
|
91
|
-
caso "processa job pendente" {
|
|
92
|
-
given { job_id: "job_1" }
|
|
93
|
-
expect { sucesso: verdadeiro }
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
task mover_para_dead_letter {
|
|
99
|
-
input {
|
|
100
|
-
job_id: Id required
|
|
101
|
-
motivo: Texto required
|
|
102
|
-
}
|
|
103
|
-
output {
|
|
104
|
-
protocolo: Id
|
|
105
|
-
}
|
|
106
|
-
rules {
|
|
107
|
-
job_id deve_ser valido
|
|
108
|
-
job.tentativas >= job.max_tentativas
|
|
109
|
-
}
|
|
110
|
-
effects {
|
|
111
|
-
persistencia Job
|
|
112
|
-
evento job_dead_letter criticidade = alta
|
|
113
|
-
notificacao operacao falha_critica_job criticidade = alta
|
|
114
|
-
auditoria dead_letter criticidade = alta
|
|
115
|
-
}
|
|
116
|
-
state ciclo_job {
|
|
117
|
-
transitions {
|
|
118
|
-
FALHOU -> DEAD_LETTER
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
guarantees {
|
|
122
|
-
protocolo existe
|
|
123
|
-
}
|
|
124
|
-
tests {
|
|
125
|
-
caso "move job esgotado" {
|
|
126
|
-
given { job_id: "job_esgotado" motivo: "Timeout repetido" }
|
|
127
|
-
expect { sucesso: verdadeiro }
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
module exemplos.integracao.externa {
|
|
2
|
-
docs {
|
|
3
|
-
resumo: "Integracao com API externa com circuit breaker e fallback."
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
entity ChamadaExterna {
|
|
7
|
-
fields {
|
|
8
|
-
id: Id
|
|
9
|
-
servico: Texto
|
|
10
|
-
endpoint: Texto
|
|
11
|
-
metodo: Texto
|
|
12
|
-
status_http: Inteiro
|
|
13
|
-
duracao_ms: Inteiro
|
|
14
|
-
sucesso: Booleano
|
|
15
|
-
realizada_em: Timestamp
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
task consultar_cep {
|
|
20
|
-
input {
|
|
21
|
-
cep: Texto required
|
|
22
|
-
}
|
|
23
|
-
output {
|
|
24
|
-
logradouro: Texto
|
|
25
|
-
bairro: Texto
|
|
26
|
-
cidade: Texto
|
|
27
|
-
estado: Texto
|
|
28
|
-
}
|
|
29
|
-
rules {
|
|
30
|
-
cep deve_ser formato_cep_valido
|
|
31
|
-
}
|
|
32
|
-
effects {
|
|
33
|
-
consulta api_cep criticidade = media
|
|
34
|
-
persistencia ChamadaExterna
|
|
35
|
-
auditoria consulta_cep
|
|
36
|
-
}
|
|
37
|
-
guarantees {
|
|
38
|
-
logradouro existe
|
|
39
|
-
cidade existe
|
|
40
|
-
estado existe
|
|
41
|
-
}
|
|
42
|
-
error {
|
|
43
|
-
cep_nao_encontrado: "CEP nao localizado."
|
|
44
|
-
servico_indisponivel: "API de CEP temporariamente indisponivel."
|
|
45
|
-
formato_invalido: "CEP deve ter 8 digitos numericos."
|
|
46
|
-
}
|
|
47
|
-
tests {
|
|
48
|
-
caso "consulta cep valido" {
|
|
49
|
-
given { cep: "01310100" }
|
|
50
|
-
expect { sucesso: verdadeiro }
|
|
51
|
-
}
|
|
52
|
-
caso "rejeita cep invalido" {
|
|
53
|
-
given { cep: "00000000" }
|
|
54
|
-
expect { sucesso: falso }
|
|
55
|
-
error { tipo: "cep_nao_encontrado" }
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
task consultar_cnpj {
|
|
61
|
-
input {
|
|
62
|
-
cnpj: Texto required
|
|
63
|
-
}
|
|
64
|
-
output {
|
|
65
|
-
razao_social: Texto
|
|
66
|
-
situacao: Texto
|
|
67
|
-
atividade_principal: Texto
|
|
68
|
-
}
|
|
69
|
-
rules {
|
|
70
|
-
cnpj deve_ser formato_cnpj_valido
|
|
71
|
-
cnpj deve_ser digitos_validos
|
|
72
|
-
}
|
|
73
|
-
effects {
|
|
74
|
-
consulta api_receita criticidade = media
|
|
75
|
-
persistencia ChamadaExterna
|
|
76
|
-
auditoria consulta_cnpj
|
|
77
|
-
}
|
|
78
|
-
guarantees {
|
|
79
|
-
razao_social existe
|
|
80
|
-
situacao existe
|
|
81
|
-
}
|
|
82
|
-
error {
|
|
83
|
-
cnpj_nao_encontrado: "CNPJ nao localizado na Receita Federal."
|
|
84
|
-
servico_indisponivel: "Servico da Receita Federal indisponivel."
|
|
85
|
-
formato_invalido: "CNPJ invalido."
|
|
86
|
-
}
|
|
87
|
-
tests {
|
|
88
|
-
caso "consulta cnpj valido" {
|
|
89
|
-
given { cnpj: "11222333000181" }
|
|
90
|
-
expect { sucesso: verdadeiro }
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
module exemplos.multi.tenant {
|
|
2
|
-
docs {
|
|
3
|
-
resumo: "Isolamento de dados por tenant com provisionamento e controle de limites."
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
entity Tenant {
|
|
7
|
-
fields {
|
|
8
|
-
id: Id
|
|
9
|
-
nome: Texto
|
|
10
|
-
slug: Texto
|
|
11
|
-
plano: Texto
|
|
12
|
-
ativo: Booleano
|
|
13
|
-
criado_em: Timestamp
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
entity LimiteTenant {
|
|
18
|
-
fields {
|
|
19
|
-
tenant_id: Id
|
|
20
|
-
recurso: Texto
|
|
21
|
-
limite: Inteiro
|
|
22
|
-
utilizado: Inteiro
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
task provisionar_tenant {
|
|
27
|
-
input {
|
|
28
|
-
nome: Texto required
|
|
29
|
-
slug: Texto required
|
|
30
|
-
plano: Texto required
|
|
31
|
-
email_admin: Email required
|
|
32
|
-
}
|
|
33
|
-
output {
|
|
34
|
-
tenant: Tenant
|
|
35
|
-
}
|
|
36
|
-
rules {
|
|
37
|
-
slug deve_ser unico em Tenant.slug
|
|
38
|
-
slug deve_ser formato_slug_valido
|
|
39
|
-
plano em [FREE, PRO, ENTERPRISE]
|
|
40
|
-
email_admin deve_ser email_valido
|
|
41
|
-
}
|
|
42
|
-
effects {
|
|
43
|
-
persistencia Tenant
|
|
44
|
-
persistencia LimiteTenant
|
|
45
|
-
persistencia Usuario
|
|
46
|
-
evento tenant_provisionado criticidade = alta
|
|
47
|
-
notificacao admin boas_vindas criticidade = media
|
|
48
|
-
auditoria provisionamento_tenant criticidade = alta
|
|
49
|
-
}
|
|
50
|
-
guarantees {
|
|
51
|
-
tenant existe
|
|
52
|
-
tenant.ativo == verdadeiro
|
|
53
|
-
}
|
|
54
|
-
error {
|
|
55
|
-
slug_duplicado: "Este slug ja esta em uso."
|
|
56
|
-
plano_invalido: "Plano selecionado nao existe."
|
|
57
|
-
email_invalido: "Email do administrador invalido."
|
|
58
|
-
}
|
|
59
|
-
tests {
|
|
60
|
-
caso "provisiona tenant pro" {
|
|
61
|
-
given { nome: "Empresa X" slug: "empresa-x" plano: "PRO" email_admin: "admin@x.com" }
|
|
62
|
-
expect { sucesso: verdadeiro }
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
task verificar_limite {
|
|
68
|
-
input {
|
|
69
|
-
tenant_id: Id required
|
|
70
|
-
recurso: Texto required
|
|
71
|
-
quantidade: Inteiro required
|
|
72
|
-
}
|
|
73
|
-
output {
|
|
74
|
-
permitido: Booleano
|
|
75
|
-
utilizado: Inteiro
|
|
76
|
-
limite: Inteiro
|
|
77
|
-
}
|
|
78
|
-
rules {
|
|
79
|
-
tenant_id deve_ser valido
|
|
80
|
-
recurso deve_ser preenchido
|
|
81
|
-
quantidade > 0
|
|
82
|
-
}
|
|
83
|
-
effects {
|
|
84
|
-
consulta LimiteTenant por tenant_id e recurso
|
|
85
|
-
auditoria verificacao_limite
|
|
86
|
-
}
|
|
87
|
-
guarantees {
|
|
88
|
-
permitido existe
|
|
89
|
-
}
|
|
90
|
-
error {
|
|
91
|
-
tenant_nao_encontrado: "Tenant nao localizado."
|
|
92
|
-
recurso_desconhecido: "Recurso nao rastreado para este tenant."
|
|
93
|
-
}
|
|
94
|
-
tests {
|
|
95
|
-
caso "dentro do limite" {
|
|
96
|
-
given { tenant_id: "ten_1" recurso: "usuarios" quantidade: 5 }
|
|
97
|
-
expect { sucesso: verdadeiro }
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
task suspender_tenant {
|
|
103
|
-
input {
|
|
104
|
-
tenant_id: Id required
|
|
105
|
-
motivo: Texto required
|
|
106
|
-
}
|
|
107
|
-
output {
|
|
108
|
-
protocolo: Id
|
|
109
|
-
}
|
|
110
|
-
rules {
|
|
111
|
-
tenant_id deve_ser valido
|
|
112
|
-
motivo deve_ser preenchido
|
|
113
|
-
tenant.ativo == verdadeiro
|
|
114
|
-
}
|
|
115
|
-
effects {
|
|
116
|
-
persistencia Tenant
|
|
117
|
-
evento tenant_suspenso criticidade = alta
|
|
118
|
-
notificacao admin suspensao_tenant criticidade = alta
|
|
119
|
-
auditoria suspensao_tenant criticidade = alta
|
|
120
|
-
}
|
|
121
|
-
state ciclo_tenant {
|
|
122
|
-
transitions {
|
|
123
|
-
ATIVO -> SUSPENSO
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
guarantees {
|
|
127
|
-
protocolo existe
|
|
128
|
-
tenant.ativo == falso
|
|
129
|
-
}
|
|
130
|
-
error {
|
|
131
|
-
tenant_ja_suspenso: "Tenant ja esta suspenso."
|
|
132
|
-
}
|
|
133
|
-
tests {
|
|
134
|
-
caso "suspende tenant ativo" {
|
|
135
|
-
given { tenant_id: "ten_1" motivo: "Inadimplencia" }
|
|
136
|
-
expect { sucesso: verdadeiro }
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
module exemplos.notificacao {
|
|
2
|
-
docs {
|
|
3
|
-
resumo: "Envio de notificacoes por email, SMS e push com rastreamento."
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
entity Notificacao {
|
|
7
|
-
fields {
|
|
8
|
-
id: Id
|
|
9
|
-
destinatario_id: Id
|
|
10
|
-
canal: Texto
|
|
11
|
-
titulo: Texto
|
|
12
|
-
corpo: Texto
|
|
13
|
-
status: Texto
|
|
14
|
-
enviada_em: Timestamp
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
task enviar_email {
|
|
19
|
-
input {
|
|
20
|
-
destinatario: Email required
|
|
21
|
-
titulo: Texto required
|
|
22
|
-
corpo: Texto required
|
|
23
|
-
template: Texto
|
|
24
|
-
}
|
|
25
|
-
output {
|
|
26
|
-
notificacao_id: Id
|
|
27
|
-
}
|
|
28
|
-
rules {
|
|
29
|
-
destinatario deve_ser email_valido
|
|
30
|
-
titulo deve_ser preenchido
|
|
31
|
-
corpo deve_ser preenchido
|
|
32
|
-
}
|
|
33
|
-
effects {
|
|
34
|
-
consulta provedor_email criticidade = alta
|
|
35
|
-
persistencia Notificacao
|
|
36
|
-
auditoria email_enviado
|
|
37
|
-
}
|
|
38
|
-
guarantees {
|
|
39
|
-
notificacao_id existe
|
|
40
|
-
}
|
|
41
|
-
error {
|
|
42
|
-
destinatario_invalido: "Endereco de email invalido."
|
|
43
|
-
provedor_indisponivel: "Servico de email temporariamente indisponivel."
|
|
44
|
-
limite_excedido: "Limite de envios por hora atingido."
|
|
45
|
-
}
|
|
46
|
-
tests {
|
|
47
|
-
caso "envia email valido" {
|
|
48
|
-
given { destinatario: "user@app.com" titulo: "Bem vindo" corpo: "Ola!" }
|
|
49
|
-
expect { sucesso: verdadeiro }
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
task enviar_push {
|
|
55
|
-
input {
|
|
56
|
-
device_token: Texto required
|
|
57
|
-
titulo: Texto required
|
|
58
|
-
corpo: Texto required
|
|
59
|
-
dados: Objeto
|
|
60
|
-
}
|
|
61
|
-
output {
|
|
62
|
-
notificacao_id: Id
|
|
63
|
-
}
|
|
64
|
-
rules {
|
|
65
|
-
device_token deve_ser preenchido
|
|
66
|
-
titulo deve_ser preenchido
|
|
67
|
-
}
|
|
68
|
-
effects {
|
|
69
|
-
consulta provedor_push criticidade = media
|
|
70
|
-
persistencia Notificacao
|
|
71
|
-
auditoria push_enviado
|
|
72
|
-
}
|
|
73
|
-
guarantees {
|
|
74
|
-
notificacao_id existe
|
|
75
|
-
}
|
|
76
|
-
error {
|
|
77
|
-
token_invalido: "Token de dispositivo invalido ou expirado."
|
|
78
|
-
provedor_indisponivel: "Servico push indisponivel."
|
|
79
|
-
}
|
|
80
|
-
tests {
|
|
81
|
-
caso "envia push valido" {
|
|
82
|
-
given { device_token: "tok_123" titulo: "Alerta" corpo: "Nova mensagem" }
|
|
83
|
-
expect { sucesso: verdadeiro }
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
flow notificar_multicanal {
|
|
89
|
-
destinatario_id: Id
|
|
90
|
-
titulo: Texto
|
|
91
|
-
corpo: Texto
|
|
92
|
-
etapa email usa enviar_email com destinatario = destinatario_id, titulo = titulo, corpo = corpo em_sucesso concluir em_erro registrar_falha_email
|
|
93
|
-
etapa push usa enviar_push com device_token = destinatario_id, titulo = titulo, corpo = corpo em_sucesso concluir em_erro registrar_falha_push
|
|
94
|
-
etapa registrar_falha_email usa registrar_falha_notificacao com canal = "email" depende_de email
|
|
95
|
-
etapa registrar_falha_push usa registrar_falha_notificacao com canal = "push" depende_de push
|
|
96
|
-
etapa concluir usa confirmar_notificacao com destinatario_id = destinatario_id depende_de email
|
|
97
|
-
}
|
|
98
|
-
}
|