Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automação de criação de novos termos e resolução de colisões na geração de IDs #100

Closed
rwietter opened this issue Oct 13, 2023 · 4 comments · Fixed by #136 · May be fixed by #112
Closed

Automação de criação de novos termos e resolução de colisões na geração de IDs #100

rwietter opened this issue Oct 13, 2023 · 4 comments · Fixed by #136 · May be fixed by #112
Assignees
Labels
enhancement New feature or request
Milestone

Comments

@rwietter
Copy link
Contributor

rwietter commented Oct 13, 2023

Colisão de IDs

Tivemos dois pr's para a feature de cards favoritos, o primeiro #77 cria a feature de favoritar cards e coloca uma identificação única sequencial. O pr #87 faz um refactor nessa feature e altera o id sequencial para id baseado no título. Isso é bom pois evita adicionar manualmente o id.

Mas ainda ocorre de o mesmo título servir para conceitos diferentes, ou no caso do gif abaixo onde é removido caracteres que não são letras e o título fica para ambos c e c. Como mostrado no gif abaixo, onde o click no segundo card aciona apenas o primeiro já que ambos tem os mesmo id. Utilizar um UUID dinamicamente também é um problema, pois toda vez que a página for carregada, o id será outro e o id salvo no localStorage não será igual ao id do card.

duplicated-title-id

Para resolver este inconveniente, apliquei um algoritmo de hash simples que gera um id baseado em conteúdo, mais específicamente, a partir da descrição do conceito, que é uma cadeia de caracteres maior. Isso elimina tal problemática e não necessita o uso de dependências externas.

Automação de inserção de termos por CLI

Essa issue também se destina para a discussão de um Script JS executado pelo Node.js com zero dependências externas, no qual já estou desenvolvendo, para adicionar novos conceitos via CLI (Command-line interface).

Por exemplo, para rodar script pode ser com yarn new ou npm run new ou então pnpm run new. Onde new é um script do package.json.

$ npm run new
Digite o valor para title: Lambda
Digite o valor para description: Uma função lambda permite a criação de funções anônimas de primeira classe...
Digite o valor para tags: Conceito
Digite o valor para code: quadrado = lambda x: x**2

Por exemplo, a saída seria o novo termo gravado juntamente com o restante do cards_pt-br.json:

[
   {},
   {},
   {
    "id": "3090d928-b9a7-4fbd-9089-16d265075ef1",
    "title": "Lambda",
    "description": "Uma função lambda permite a criação de funções anônimas de primeira classe...",
    "tags": [
      "Conceito"
    ],
    "content": {
      "code": "quadrado = lambda x: x**2"
    }
  }
]

Nesse caso, o id é gerado automaticamente pelo crypto.randomUUID do Node, não seria necessário usar nenhuma biblioteca externa ao Node.js para fazer isso. Nesse caso, quando o termo for gerado pelo Script, terá por padrão um id e o código do card já trabalhará com este id ao invés do id gerado pelo algoritmo de hash de conteúdo descrito acima. Ou seja, ambos são suportados, podendo criar um novo termo manualmente mudando o código ou gerando a partir do CLI.

As bibliotecas utilizadas do Node são:

const fs = require("node:fs");
const path = require("node:path");
const readline = require("node:readline");
const { stdin: input, stdout: output } = require("node:process");
const crypto = require("node:crypto");

Isso visa automatizar o processo de adição de novos termos. Também visa escalabilidade já que após o arquivo cards_pt-br vier a ter milhares de linhas, torna-se mais pesado para abrir e pode ocorrer erros de comma, bracket, etc.

@rwietter
Copy link
Contributor Author

rwietter commented Oct 13, 2023

@levxyca pode atribuir a mim esse problema. Posso fazer dois Pull Requests, o primeiro corrigindo o problema de colisões do pr #87 e depois podemos discutir sobre o CLI.

Assim que eles forem mesclados, eu resolvo os conflitos se houver e já subo o fix.

@freitaschz
Copy link
Collaborator

Magnífico, @rwietter !! Quando abri o PR #87 realmente não me atentei a isso, como no caso dos termos C e C++. Essa issue soma muito ao projeto e vai deixar tudo mais dinâmico.

@levxyca
Copy link
Owner

levxyca commented Oct 13, 2023

sensacional @rwietter! vou atribuir a issue a você! atualmente um dos desafios do diciotech é justamente a inserção de novos termos e isso vai facilitar muito!

@levxyca levxyca added the enhancement New feature or request label Oct 13, 2023
@levxyca levxyca moved this to Todo in diciotech Oct 13, 2023
@levxyca levxyca added this to the v2 milestone Oct 13, 2023
@levxyca levxyca moved this from Todo to In Progress in diciotech Nov 7, 2023
@levxyca
Copy link
Owner

levxyca commented Nov 7, 2023

@levxyca pode atribuir a mim esse problema. Posso fazer dois Pull Requests, o primeiro corrigindo o problema de colisões do pr #87 e depois podemos discutir sobre o CLI.

Assim que eles forem mesclados, eu resolvo os conflitos se houver e já subo o fix.

@rwietter o plano dessa semana é dar merge nos PR's referente aos favoritos, o #77 já no jeito e assim que o @thiagofqs atualizar a branch dele dou merge no #77 e no #87 em seguida.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment