hcf-api's People
hcf-api's Issues
[API] Refatoração na migração e relações de coletores com o Tombo
Com intuito de organizar e melhoras as relações do tombo com coletores, foi decidido fazer uma refatoração em como os registros são armazenados.
A partir de agora vamos somente o ID do coletor principal no tombo, os coletores complementares serão armazenados em um único campo de texto numa tabela chamada coletores_complementares
.
O diagrama abaixo exemplifica como as tabelas vão ficar:
[API] Atualização de bibliotecas do projeto
User Statement
Como desenvolvedor do projeto da API
(1)
quero fazer uso de tecnologias mais recentes
para melhorar a produtividade e legibilidade do código
(2)
quero atualizar as bibliotecas do projeto
para evitar problemas de segurança
Technical Info
Checklist
- Adicionar TypeScript
Acceptance Criteria
[API] Remover a criação do diretório intermediário durante o upload de imagens
Atualmente a API está criando um diretório com a data atual dentro do diretórios de upload no servidor.
- Remover o código para criação deste diretório, o upload deve ser feito diretamente na raíz do diretório de uploads
[API] Solo, vegetação e relevo não estão sendo salvos
Ao cadastrar um novo tombo, embora o painel esteja enviando as informações de solo, relevo e vegetação, a API não está salvando as informações.
Acceptance criteria
# | Given | When | Then |
---|---|---|---|
1 | O usuário está cadastrando um novo tombo | Qualquer um dos campos "Solo", "Relevo" ou "Vegetação" for preenchido | A API deve salvar as informações corretamente no banco para consulta posterior |
2 | O usuário está cadastrando um novo tombo | Qualquer um dos campos "Solo", "Relevo" ou "Vegetação" não for preenchido | A API não deve impedir o tombo de ser cadastrado, mantendo os valores não preenchidos como nulos |
[Infra] Obter novas imagens de Tombos
Fazer upload das imagens atualizadas para o servidor do HCF.
Crud variedades
Crud relevos
[API] Adicionar reCAPTCHA nas rotas publicas do backend
[API] Exibir parentesco e associações nas listagens
Adicionar as informações (se necessário) no retorno das rotas:
Subfamílias
- Família (com filtro)
- Autor
Gênero
- Família (com filtro)
Espécies
- Família (com filtro)
- Gênero (com filtro)
- Autor
Subespécies
- Família (com filtro)
- Gênero (com filtro)
- Espécie (com filtro)
- Autor
Variedades
- Família (com filtro)
- Gênero (com filtro)
- Espécie (com filtro)
- Autor
Autores
- Iniciais
Crud fases sucessionais
[API] Impossibilitar a exclusão de registros com outros registros associados
Overview
Hoje o sistema está permitindo que eu faça a exclusão de um registro de família que tenha subfamília associadas, o que não deve acontecer.
Technical info
O painel hoje tem um botão de exclusão de um registro nas listagens de taxonomia, que pode ser usado mesmo em registros com outros registros associados.
Você deve fazer uma validação se o registro que está sendo excluído possui registros associados ou não (família e subfamília por exemplo) e retornar um error dizendo que a operação não pode ser realizada.
[API] Falha na listagem de herbários
Technical Info
O endpoint para listagem de herbários está retornando erro (500 Internal Server Error
), veja os detalhes abaixo:
2023-10-24T01:20:49.245887753Z DatabaseError [SequelizeDatabaseError]: Unknown column 'endereco->cidade.latitude' in 'field list'
2023-10-24T01:20:49.245904127Z at Query.formatError (/home/node/app/node_modules/sequelize/lib/dialects/mysql/query.js:247:16)
2023-10-24T01:20:49.245910335Z at Query.handler [as onResult] (/home/node/app/node_modules/sequelize/lib/dialects/mysql/query.js:68:23)
2023-10-24T01:20:49.245915842Z at Query.execute (/home/node/app/node_modules/mysql2/lib/commands/command.js:36:14)
2023-10-24T01:20:49.245952518Z at Connection.handlePacket (/home/node/app/node_modules/mysql2/lib/connection.js:478:34)
2023-10-24T01:20:49.245957834Z at PacketParser.onPacket (/home/node/app/node_modules/mysql2/lib/connection.js:97:12)
2023-10-24T01:20:49.245962700Z at PacketParser.executeStart (/home/node/app/node_modules/mysql2/lib/packet_parser.js:75:16)
2023-10-24T01:20:49.245967680Z at Socket.<anonymous> (/home/node/app/node_modules/mysql2/lib/connection.js:104:25)
2023-10-24T01:20:49.245972962Z at Socket.emit (node:events:513:28)
2023-10-24T01:20:49.245977672Z at addChunk (node:internal/streams/readable:324:12)
2023-10-24T01:20:49.245982396Z at readableAddChunk (node:internal/streams/readable:297:9)
2023-10-24T01:20:49.245987144Z at Readable.push (node:internal/streams/readable:234:10)
2023-10-24T01:20:49.245992088Z at TCP.onStreamRead (node:internal/stream_base_commons:190:23) {
2023-10-24T01:20:49.245996879Z parent: Error: Unknown column 'endereco->cidade.latitude' in 'field list'
2023-10-24T01:20:49.246001785Z at Packet.asError (/home/node/app/node_modules/mysql2/lib/packets/packet.js:728:17)
2023-10-24T01:20:49.246010409Z at Query.execute (/home/node/app/node_modules/mysql2/lib/commands/command.js:29:26)
2023-10-24T01:20:49.246015353Z at Connection.handlePacket (/home/node/app/node_modules/mysql2/lib/connection.js:478:34)
2023-10-24T01:20:49.246020169Z at PacketParser.onPacket (/home/node/app/node_modules/mysql2/lib/connection.js:97:12)
2023-10-24T01:20:49.246024998Z at PacketParser.executeStart (/home/node/app/node_modules/mysql2/lib/packet_parser.js:75:16)
2023-10-24T01:20:49.246030036Z at Socket.<anonymous> (/home/node/app/node_modules/mysql2/lib/connection.js:104:25)
2023-10-24T01:20:49.246035052Z at Socket.emit (node:events:513:28)
2023-10-24T01:20:49.246039746Z at addChunk (node:internal/streams/readable:324:12)
2023-10-24T01:20:49.246044904Z at readableAddChunk (node:internal/streams/readable:297:9)
2023-10-24T01:20:49.246049690Z at Readable.push (node:internal/streams/readable:234:10)
2023-10-24T01:20:49.246054479Z at TCP.onStreamRead (node:internal/stream_base_commons:190:23) {
2023-10-24T01:20:49.246074576Z code: 'ER_BAD_FIELD_ERROR',
2023-10-24T01:20:49.246079244Z errno: 1054,
2023-10-24T01:20:49.246084512Z sqlState: '42S22',
2023-10-24T01:20:49.246089117Z sqlMessage: "Unknown column 'endereco->cidade.latitude' in 'field list'",
2023-10-24T01:20:49.246094334Z sql: 'SELECT `herbarios`.`id`, `herbarios`.`nome`, `herbarios`.`caminho_logotipo`, `herbarios`.`sigla`, `herbarios`.`email`, `endereco`.`id` AS `endereco.id`, `endereco`.`numero` AS `endereco.numero`, `endereco`.`logradouro` AS `endereco.logradouro`, `endereco`.`complemento` AS `endereco.complemento`, `endereco->cidade`.`id` AS `endereco.cidade.id`, `endereco->cidade`.`nome` AS `endereco.cidade.nome`, `endereco->cidade`.`latitude` AS `endereco.cidade.latitude`, `endereco->cidade`.`longitude` AS `endereco.cidade.longitude`, `endereco->cidade->estado`.`id` AS `endereco.cidade.estado.id`, `endereco->cidade->estado`.`nome` AS `endereco.cidade.estado.nome`, `endereco->cidade->estado`.`codigo_telefone` AS `endereco.cidade.estado.codigo_telefone`, `endereco->cidade->estado->paise`.`id` AS `endereco.cidade.estado.paise.id`, `endereco->cidade->estado->paise`.`nome` AS `endereco.cidade.estado.paise.nome`, `endereco->cidade->estado->paise`.`sigla` AS `endereco.cidade.estado.paise.sigla` FROM `herbarios` AS `herbarios` LEFT OUTER JOIN `enderecos` AS `endereco` ON `herbarios`.`endereco_id` = `endereco`.`id` LEFT OUTER JOIN `cidades` AS `endereco->cidade` ON `endereco`.`cidade_id` = `endereco->cidade`.`id` LEFT OUTER JOIN `estados` AS `endereco->cidade->estado` ON `endereco->cidade`.`estado_id` = `endereco->cidade->estado`.`id` LEFT OUTER JOIN `paises` AS `endereco->cidade->estado->paise` ON `endereco->cidade->estado`.`pais_id` = `endereco->cidade->estado->paise`.`id` WHERE `herbarios`.`ativo` = true ORDER BY `herbarios`.`id` DESC LIMIT 0, 20;'
O error está sendo causado provavelmente pela modificação do banco de dados.
O painel hoje exibe esta mensagem somente
Acceptance Criteria
# | Given | When | Then |
---|---|---|---|
1 | A tela de listagem de herbário é aberta | O painel requisitar o endpoint de listagem de herbários | Os dados devem ser retornados corretamente como eram antes |
[API] Conversão do banco para o formato Darwin Core
Se faz necessário adaptar o script de conversão do banco de dados (em MySQL) para o CSV em formato Darwin Core. Você pode obter mais informações no website oficial do Darwin Core.
User Statement
Como Curador do Herbário
(1)
quero fazer o download do arquivo CSV em formato Darwin Core
para fazer o upload e atualização dos dados no Darwin Core com as informações do meu banco
(2)
quero fazer o download do arquivo CSV nomeado no formato HCF_DarwinCore_2023-01-23.csv
para diferenciar cada download feito por dia
Technical Info
A implementação atual está no arquivo src/controllers/darwincore-controller.js
e precisa de alguns ajustes para as modificações que foram feitas no banco de dados e para melhorar o desempenho no momento de seleção dos dados e geração do arquivo.
Seleção dos dados
A seleção dos dados no banco atual é feito com um framework, o Sequelize. A sugestão é utilizar algo mais "baixo nível", como por exemplo o KnexJS escrevendo os comandos SQL e fazendo a seleção diretamente, diminuindo a complexidade do SQL gerado e evitando conversão de registros no banco em objetos complexos (feito pelo ORM).
O script faz hoje a seleção de todos os registros existentes sem limite, o que faz desperdício de recursos do servidor. Modifique para que o processo de seleção e conversão sejam feitos em lotes, com limite para seleção de dados.
Se ajudar no entendimento, esta mesma conversão está implementada baseada no banco de dados antigo (Firebird) e o código está disponível aqui FirebirdToDarwin.
Você pode também utilizar este projeto para validação do resultado, comparando o arquivo gerado pelo código em Java que se baseia no banco original com o arquivo gerado pelo código em NodeJS que se baseia no banco de dados novo.
Acceptance Criteria
# | Given | When | Then |
---|---|---|---|
1 | O arquivo gerado a partir do código em Java baseado no banco Firebird | Comparado com o arquivo gerado pelo script em NodeJS baseado no banco MySQL | Os arquivos devem conter os mesmos dados |
2 | O usuário fez a solicitação para geração do arquivo CSV | A conversão e download do arquivo for iniciada | O conteúdo deve ser entregue em partes até ser concluído |
References
[PYTHON] - Criar inserção de dados de tipos de usuários
Criar a inserção dos seguintes dados na tabela de tipos_usuarios:
id: 1
tipo: CURADOR
id: 2
tipo: OPERADOR
id: 3
tipo: IDENTIFICADOR
[Python] Registros de subespécies repetidas
Overview
Alguns registros na tabela de "subespécies" estão repetidos, mesmo estando associados à mesma família (e.g. guianensis
)
Você deve investigar e validar o porque isso está acontecendo. Use o SQL abaixo para iniciar a investigação:
select
sub_especies.id sub_especie_id,
sub_especies.nome sub_especie_nome,
especies.id especie_id,
especies.nome especie_nome
from sub_especies
join especies on especies.id = sub_especies.especie_id
Crud vegetações
[API] Aceitar seleção multipla no campo de identificadores
Dados que o painel deve aceitar a seleção de vários identificadores, se faz necessário a alteração dos endpoints na API para aceitar valores multiplos: utfpr/hcf-painel#32
- Alterar rota de cadastro
- Alterar rota de edição
- Alterar rota de detalhes
- Alterar rota de listagem (se necessário)
[API] Parâmetro de ordenação nas rotas de listagens
Overview
Possibilitar que o painel web faça a ordenação do conteúdo da tabela de forma crescente ou descrescente.
A solução descrita abaixo deve ser aplicada em todas as rotas de listagens. Você pode criar um middleware de forma que facilite o reaproveitamente de código.
User statement
(1)
como usuáro do sistema
quero poder ordenar o conteúdo de uma listagem
Technical info
Nas rotas de listagens, crie um parâmetro chamado order
que deve recever como valor o padrão coluna:direção
onde coluna
será o nome que a API define para cada coluna da tabela, e ordenação
pode ser asc
e desc
que indica a direção para a ordenação do conteúdo.
Exemplo:
- Na listagem de famílias, para ordenar pela coluna "família" de forma descrecente a API deve receber o parâmetro de query como
order=familia:desc
- Na listagem de subfamília, para ordernar pela coluna "subfamília" de forma crescente a API deve receber o parâmetro de query como
order=subfamilia:asc
- Na listagem de subfamília, para ordernar pela coluna "autor" de forma decrescente a API deve receber o parâmetro de query como
order=autor:desc
Acceptance criteria
# | Given | When | Then |
---|---|---|---|
1 | O endpoint de listagem é requisitado | O parâmetro order não é enviado |
O conteúdo não deve sofrer alteração na ordenação, retornando exatamente o que o banco de dados devolve |
2 | O endpoint de listagem é requisitado | O parâmetro order é enviado com direção asc |
O conteúdo deve ser ordenado baseado na coluna enviada de forma crescente |
3 | O endpoint de listagem é requisitado | O parâmetro order é enviado com direção desc |
O conteúdo deve ser ordenado baseado na coluna enviada de forma decrescente |
4 | O endpoint de listagem é requisitado | O parâmetro order é enviado com uma coluna não definida previamente |
A resposta deve conter um objeto de erro informando que a coluna enviada não é aceita |
5 | O endpoint de listagem é requisitado | O parâmetro order é enviado com uma direção inválida |
A resposta deve conter um objeto de erro informando que a direção enviada não é aceita |
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.