diff --git a/interface-linha-comando/gerar/gerador-rotas.ts b/interface-linha-comando/gerar/gerador-rotas.ts index df92a43..5f27fdb 100644 --- a/interface-linha-comando/gerar/gerador-rotas.ts +++ b/interface-linha-comando/gerar/gerador-rotas.ts @@ -3,7 +3,7 @@ import * as caminho from 'path'; import { Classe } from '@designliquido/delegua/fontes/declaracoes'; import { pluralizar } from '@designliquido/flexoes'; -import { criarDiretorioSeNaoExiste } from '.'; +import { criarDiretorioComIdSeNaoExiste, criarDiretorioSeNaoExiste } from '.'; export class GeradorRotas { indentacao: number; @@ -31,9 +31,9 @@ export class GeradorRotas { criarDiretorioSeNaoExiste('rotas', nomeModeloPlural); - const rotasCriadas = []; + let rotasCriadas = []; rotasCriadas.push(this.criarNovasRotasSemId(declaracaoModelo, diretorioRotas)); - rotasCriadas.push(this.criarNovasRotasComId(declaracaoModelo, diretorioRotas)); + rotasCriadas = rotasCriadas.concat(this.criarNovasRotasComId(declaracaoModelo, diretorioRotas)); return rotasCriadas; } @@ -63,18 +63,35 @@ export class GeradorRotas { * @param {string} diretorioRotas O diretório onde o arquivo de rotas deve ser salvo. * @returns O caminho do arquivo de rotas no sistema de arquivos. */ - private criarNovasRotasComId(declaracaoModelo: Classe, diretorioRotas: string): string { + private criarNovasRotasComId(declaracaoModelo: Classe, diretorioRotas: string): string[] { const conteudoSelecionarUm = this.criarRotaSelecionarUm(declaracaoModelo); + const conteudoSelecionarParaEdicao = this.criarRotaEditar(declaracaoModelo); const conteudoAtualizar = `liquido.rotaPut(funcao(requisicao, resposta) {\n resposta.lmht({ "titulo": "Liquido" })\n})\n\n`; + const conteudoSelecionarParaExclusao = this.criarRotaConfirmarExclusao(declaracaoModelo); const conteudoExcluir = `liquido.rotaDelete(funcao(requisicao, resposta) {\n resposta.lmht({ "titulo": "Liquido" })\n})\n\n`; - const conteudoRotas = `${conteudoSelecionarUm}${conteudoAtualizar}${conteudoExcluir}`; + const conteudoRotas = `${conteudoSelecionarUm}${conteudoSelecionarParaEdicao}${conteudoAtualizar}${conteudoSelecionarParaExclusao}${conteudoExcluir}`; - const caminhoRotas = caminho.join(diretorioRotas, '[id].delegua'); + const diretorioRotasComId = criarDiretorioComIdSeNaoExiste(diretorioRotas); + + const caminhoRotasId = caminho.join(diretorioRotasComId, 'inicial.delegua'); sistemaArquivos.writeFileSync( - caminhoRotas, + caminhoRotasId, conteudoRotas ); - return caminhoRotas; + + const caminhoRotaEditar = caminho.join(diretorioRotasComId, 'editar.delegua'); + sistemaArquivos.writeFileSync( + caminhoRotaEditar, + conteudoRotas + ); + + const caminhoRotaExcluir = caminho.join(diretorioRotasComId, 'excluir.delegua'); + sistemaArquivos.writeFileSync( + caminhoRotaExcluir, + conteudoRotas + ); + + return [caminhoRotasId, caminhoRotaEditar, caminhoRotaExcluir]; } private criarRotaSelecionarTudo(declaracaoModelo: Classe) { @@ -96,7 +113,7 @@ export class GeradorRotas { `})\n\n`; } - private criarRotaSelecionarUm(declaracaoModelo: Classe) { + private criarRotaSelecionarUm(declaracaoModelo: Classe): string { // Isso aqui não vai ficar assim. // É preciso montar as partes de dados antes. const dadosTestes = []; @@ -112,4 +129,38 @@ export class GeradorRotas { `${" ".repeat(this.indentacao)}})\n` + `})\n\n`; } + + private criarRotaEditar(declaracaoModelo: Classe): string { + // Isso aqui não vai ficar assim. + // É preciso montar as partes de dados antes. + const dadosTestes = []; + for (const propriedade of declaracaoModelo.propriedades) { + dadosTestes.push(`"${propriedade.nome.lexema}": "Teste"`); + } + + return `liquido.rotaGet(funcao(requisicao, resposta) {\n` + + `${" ".repeat(this.indentacao)}resposta.lmht("editar", {\n` + + `${" ".repeat(this.indentacao * 2)}${dadosTestes.reduce( + (acumulador, elemento) => acumulador + ', ' + elemento + )}\n` + + `${" ".repeat(this.indentacao)}})\n` + + `})\n\n`; + } + + private criarRotaConfirmarExclusao(declaracaoModelo: Classe): string { + // Isso aqui não vai ficar assim. + // É preciso montar as partes de dados antes. + const dadosTestes = []; + for (const propriedade of declaracaoModelo.propriedades) { + dadosTestes.push(`"${propriedade.nome.lexema}": "Teste"`); + } + + return `liquido.rotaGet(funcao(requisicao, resposta) {\n` + + `${" ".repeat(this.indentacao)}resposta.lmht("confirmar-exclusao", {\n` + + `${" ".repeat(this.indentacao * 2)}${dadosTestes.reduce( + (acumulador, elemento) => acumulador + ', ' + elemento + )}\n` + + `${" ".repeat(this.indentacao)}})\n` + + `})\n\n`; + } } \ No newline at end of file diff --git a/interface-linha-comando/gerar/index.ts b/interface-linha-comando/gerar/index.ts index 29865bf..7b65dcd 100644 --- a/interface-linha-comando/gerar/index.ts +++ b/interface-linha-comando/gerar/index.ts @@ -51,3 +51,18 @@ export function criarDiretorioSeNaoExiste(...partesDiretorio: string[]) { sistemaArquivos.mkdirSync(caminhoDiretorio); } } + +/** + * Cria na raiz do projeto um diretório passado por parâmetro, se já não existir, com `[id]` no final. + * Precisa ser separado porque o `caminho.join` aparentemente estraga o nome do diretório. + * @param {string} diretorioRotas O prefixo do diretório a ser verificado/criado. + */ +export function criarDiretorioComIdSeNaoExiste(diretorioRotas: string): string { + const caminhoDiretorio = diretorioRotas + `\\[id]`; + + if (!sistemaArquivos.existsSync(caminhoDiretorio)) { + sistemaArquivos.mkdirSync(caminhoDiretorio); + } + + return caminhoDiretorio; +} diff --git a/liquido.ts b/liquido.ts index 08f6a9f..f60db89 100644 --- a/liquido.ts +++ b/liquido.ts @@ -119,29 +119,36 @@ export class Liquido implements LiquidoInterface { for (const declaracao of retornoImportador.retornoAvaliadorSintatico.declaracoes) { const expressao: DefinirValor = (declaracao as Expressao).expressao as DefinirValor; + const objetoAlvo: AcessoMetodoOuPropriedade = expressao.objeto as AcessoMetodoOuPropriedade; const nomePropriedade: string = expressao.nome.lexema; const informacoesVariavel: VariavelInterface = expressao.valor; - if (expressao.objeto.simbolo.lexema === 'roteador') { - this.roteador.ativarMiddleware(nomePropriedade, informacoesVariavel); - } - - if (expressao.objeto.simbolo.lexema === 'autenticacao') { - if (nomePropriedade === 'tecnologia') { - switch (informacoesVariavel.valor) { - case 'jwt': - this.roteador.ativarDesativarPassport(true); - break; - default: - console.error('Tecnologia de autenticação não suportada.'); + switch (objetoAlvo.simbolo.lexema) { + case 'roteador': + this.roteador.ativarMiddleware(nomePropriedade, informacoesVariavel); + break; + case 'autenticacao': + if (nomePropriedade === 'tecnologia') { + switch (informacoesVariavel.valor) { + case 'jwt': + this.roteador.ativarDesativarPassport(true); + break; + default: + console.error('Tecnologia de autenticação não suportada.'); + } } - } - } - - if (expressao.objeto.objeto.simbolo.lexema === 'dados') { - if (expressao.objeto.simbolo.lexema === 'lincones') { - this.provedorLincones.configurar(nomePropriedade, informacoesVariavel.valor); - } + break; + case 'lincones': { + const objetoLinconesAlvo: AcessoMetodoOuPropriedade = objetoAlvo.objeto as AcessoMetodoOuPropriedade; + switch (objetoLinconesAlvo.simbolo.lexema) { + case 'dados': + this.provedorLincones.configurar(nomePropriedade, informacoesVariavel.valor); + break; + // Casos futuros aqui. + } + } + + break; } } } catch (error) { diff --git a/package.json b/package.json index aa1c2c0..39cd1d8 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "swagger": "tsoa spec" }, "dependencies": { - "@designliquido/delegua-node": "^0.29.2", + "@designliquido/delegua-node": "^0.30.2", "@designliquido/flexoes": "^0.1.0", "@designliquido/foles": "^0.6.1", "@designliquido/lincones-sqlite": "^0.0.2", diff --git a/yarn.lock b/yarn.lock index 69170b5..c76125b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -304,21 +304,21 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@designliquido/delegua-node@^0.29.2": - version "0.29.2" - resolved "https://registry.yarnpkg.com/@designliquido/delegua-node/-/delegua-node-0.29.2.tgz#828bd88481ee5e7201a789d0685d8fc44cadde62" - integrity sha512-Xn7lSG2vixj2tfL7QKyhGUONk8QkxmW4mcoYwO3lj/tgIL6NJzx/8LRf0wqR7aBlYBWqrnAnYvMbl0qlDsDcjg== +"@designliquido/delegua-node@^0.30.2": + version "0.30.2" + resolved "https://registry.yarnpkg.com/@designliquido/delegua-node/-/delegua-node-0.30.2.tgz#eb8e2bbf41d98b83c205848e2bd9ee6a4bc8b5fa" + integrity sha512-ia3nrh4wgE6N/a1GFExVy0U1ncYfLwDC0omy37qjOOcWuTpBoeNf11nyuus72Pyc/ZJvNnAlzSNtzrLKWV7u+w== dependencies: - "@designliquido/delegua" "0.29.2" + "@designliquido/delegua" "0.30.2" chalk "4.1.2" commander "^9.4.1" json-colorizer "^2.2.2" lodash.clonedeep "^4.5.0" -"@designliquido/delegua@0.29.2": - version "0.29.2" - resolved "https://registry.yarnpkg.com/@designliquido/delegua/-/delegua-0.29.2.tgz#da5eb931deede8a5cbf8fa8b95f65379972ae5ee" - integrity sha512-sdGD+b1gJBZqhfppk2WTHIaQviUylu9907kKHAXRXIEuQgUfi1GA/EFZhvr3CvHemhmbo9kQclN4JQEY+zBKUQ== +"@designliquido/delegua@0.30.2": + version "0.30.2" + resolved "https://registry.yarnpkg.com/@designliquido/delegua/-/delegua-0.30.2.tgz#8af380e6da5cb4bacf89c4aebf0e7115056037a5" + integrity sha512-mvfmq9KaOF6grXZd7MxQnEy3XOlK95uGtdgGti/taVwyvjtbJZR9aw0pwDEtuyDFBHTWAJYvsJmnH+KRWOsGkw== dependencies: antlr4ts "^0.5.0-alpha.4" browser-process-hrtime "^1.0.0"