Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
6973ee4
servidor postgres criado e sendo acessado
LuizRojas Jun 28, 2025
bdba967
removendo tree com estrutura, pois esta sujeita a mudancas
LuizRojas Jun 28, 2025
56e9d7e
Atualizando busca dos candidatos e concursos e exibição dos dados num…
LuizRojas Jul 3, 2025
8d74e1c
criando a api rest para consulta dos dados atraves de verbos http e a…
LuizRojas Jul 3, 2025
d6a08d9
removendo portas mapeadas do banco de dados
LuizRojas Jul 4, 2025
10f8c70
acrescentando as colunas profissoes e lista de vagas aos campos de co…
LuizRojas Jul 5, 2025
0597d32
acrescentando os endpoints para consulta de todos os candidatos e con…
LuizRojas Jul 5, 2025
ace6871
adicionando funcionalidade de acrescentar um candidato
LuizRojas Jul 5, 2025
cf9a839
problemas com o metodos get candidatos pelo codigo
LuizRojas Jul 9, 2025
12362ab
corrigido: data de nascimento em formato incorreto em get all candidatos
LuizRojas Jul 9, 2025
7a63c0b
corrigindo importacoes
LuizRojas Jul 9, 2025
6d0fedb
criando testes e acrescentando sonarqube
LuizRojas Jul 9, 2025
ac9c9e4
Delete .github/workflows directory
LuizRojas Jul 9, 2025
91fbeb7
Delete api_rest directory
LuizRojas Jul 9, 2025
9181d57
Delete .gitignore
LuizRojas Jul 9, 2025
83939ea
Delete README.md
LuizRojas Jul 9, 2025
4d583af
Delete candidatos.txt
LuizRojas Jul 9, 2025
2a18ee1
Delete concursos.txt
LuizRojas Jul 9, 2025
4f770b4
Delete docker-compose.yaml
LuizRojas Jul 9, 2025
c6a120c
System added readme file
LuizRojas Jul 9, 2025
b2779f8
System generated commit, initial commit
LuizRojas Jul 9, 2025
7669a84
Update README.md
LuizRojas Jul 10, 2025
a2504e9
Delete jslibs directory
LuizRojas Jul 10, 2025
8436d06
Delete pages/Home directory
LuizRojas Jul 10, 2025
47a1015
Delete README.md
LuizRojas Jul 10, 2025
bae4a30
Delete application.json
LuizRojas Jul 10, 2025
aabe25d
Delete metadata.json
LuizRojas Jul 10, 2025
42fd7c0
Delete theme.json
LuizRojas Jul 10, 2025
c0c9f53
System added readme file
LuizRojas Jul 10, 2025
34d128f
System generated commit, initial commit
LuizRojas Jul 10, 2025
d0d1e7c
Update README.md
LuizRojas Jul 10, 2025
0024dba
Rename README.md to README_ORIGINAL.md
LuizRojas Jul 10, 2025
141403a
Create README.md
LuizRojas Jul 10, 2025
a32bec0
Add files via upload
LuizRojas Jul 10, 2025
4b8d111
Add files via upload
LuizRojas Jul 10, 2025
e112073
Update README.md
LuizRojas Jul 10, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# diretorios de dados do Docker Compose (GERADOS EM TEMPO DE EXECUÇÃO)
/data/
/stacks/
/sonarqube_data/
/postgres_config/
/sonarqube_extensions/
/sonarqube_logs/
/sonar_db_data/

# Caches e arquivos gerados pelo Python
__pycache__/
*.pyc
.pytest_cache/
.coverage # Arquivo de cobertura de testes gerado pelo pytest-cov
.env
Thumbs.db
*.log
221 changes: 148 additions & 73 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,98 +1,173 @@
# Desafio Low Code - LEDS
*Bem-vindo!* 👋
# Desafio LEDS - Sistema de Gerenciamento de Concursos e Candidatos

Neste desafio, você terá a oportunidade de demonstrar que possui as habilidades necessárias para atuar no time de Low/No Code.
## [_Clique para acessar Aplicação_](https://desafio-leds-luizrojas.appsmith.com/app/desafio-back-end-lowcode-leds/home-686eec1a4c97004f2122aea6?branch=main)

# Contextualização
## 1. Contextualização e Objetivo

O desafio é desenvolver um sistema em Low/No Code que permita realizar as seguintes buscas:
1. Listar os **órgãos, códigos e editais dos concursos públicos** que se encaixam no perfil do candidato, tomando como base o seu **CPF**;
2. Listar o **nome, data de nascimento e o CPF** dos candidatos que se encaixam no perfil do concurso tomando com base o **Código do Concurso** do concurso público;
Este projeto foi desenvolvido como parte do **Desafio Low/No Code - LEDS**.
O objetivo principal é criar um sistema capaz de realizar buscas e gerenciar dados de concursos públicos e candidatos, atendendo aos seguintes requisitos:

O arquivo **candidatos.txt** contém as informações dos candidatos:
- **Listar os órgãos, códigos e editais** dos concursos públicos que se encaixam no perfil do candidato, com base no CPF informado.
- **Listar o nome, data de nascimento e CPF** dos candidatos que se encaixam no perfil de um concurso, com base no código do concurso.
- Disponibilizar operações completas de **CRUD** (Create, Read, Update, Delete) para candidatos e concursos.

| Nome | Data de Nascimento | CPF | Profissões|
|---|---|---|---|
| Lindsey Craft | 19/05/1976 | 182.845.084-34 | [carpinteiro] |
| Jackie Dawson | 14/08/1970 | 311.667.973-47 | [marceneiro, assistente administrativo] |
| Cory Mendoza | 11/02/1957 | 565.512.353-92 | [carpinteiro, marceneiro] |
---

O arquivo **concursos.txt** contém as informações dos concursos públicos:
## 2. Tecnologias Utilizadas

| Órgão | Edital | Código do Concurso | Lista de vagas|
|---|---|---|---|
| SEDU | 9/2016 | 61828450843 | [analista de sistemas, marceneiro] |
| SEJUS | 15/2017 | 61828450843 | [carpinteiro,professor de matemática,assistente administrativo] |
| SEJUS | 17/2017 | 95655123539 | [professor de matemática] |
| Camada | Tecnologia |
| ------ | ---------- |
| Frontend / Plataforma Low‑Code | **Appsmith** |
| Backend / API REST | **Python (Flask)** |
| Banco de Dados | **PostgreSQL** (local via Docker) <br> **Neon DB** (nuvem) |
| Conteinerização | **Docker** & **Docker Compose** |

🤩 **As tecnologias a serem utilizadas na implementação da solução ficam a seu critério!**
---

# Como entregar?
1. Faça um **fork** do repositório. Nesse fork esperamos encontrar uma documentação completa da solução e a listagem dos diferenciais implementados.
2. Abra um **pull request (PR)** do seu fork para o nome repositório com o seu nome como título. Assim conseguimos te localizar melhor e ver que você já finalizou o desafio!
## 3. Arquitetura da Solução

🚨 **Atenção**: você deve enviar apenas o código fonte. Não serão aceitos códigos compilados.
A solução foi pensada em microsserviços conteinerizados, separados em duas abordagens complementares:

## Avaliação
1. **Execução local (Docker Compose)**
- **Appsmith**: Interface do usuário, comunicando‑se com a API.
- **API REST (Flask)**: Implementa a lógica de negócio e expõe endpoints RESTful.
- **PostgreSQL**: Banco de dados rodando em contêiner.

O programa será avaliado levando em conta os seguintes critérios:
2. **Execução em nuvem (Appsmith Cloud + Neon DB)**
- **Appsmith Online** se conecta **diretamente** ao **Neon DB**, dispensando API própria quando desejado.
- O código‑fonte da API permanece disponível para evoluções futuras ou execução on‑premises.

| Critério | Valor |
|---|---|
| Legibilidade do Código | 10 |
| Documentação do código | 10 |
| Documentação da solução | 10 |
| Tratamento de Erros | 10 |
| Total | 40 |
Um diagrama simplificado:

A sua pontuação será a soma dos valores obtidos nos critérios acima.
```text
┌──────────┐ REST ┌────────────┐
│ Appsmith │ ───────────────▶ │ API │
│ Frontend │ ◀─────────────── │ Flask │
└──────────┘ JSON └────┬───────┘
│ SQL
┌──────▼──────┐
│ PostgreSQL │
└─────────────┘
```

## Diferenciais
Você pode **aumentar sua pontuação** implementando os seguintes diferenciais:
---

| Item | Pontos Ganhos |
|---|---|
| Criar um [serviço](https://martinfowler.com/articles/microservices.html) com o problema | 30 |
| Utilizar banco de dados | 30 |
| Implementar Clean Code | 20 |
| Implementar o padrão de programação da tecnologia escolhida | 20 |
| Qualidade de [Código com SonarQube](https://about.sonarcloud.io/) | 15 |
| Implementar testes unitários | 15 |
| Implementar testes comportamentais | 15 |
| Implementar integração com [Github Action](https://github.com/features/actions) | 10 |
| Implementar integração com Github Action + SonarQube | 10 |
| Implementar usando Docker | 5 |
| Total| 170 |
## 4. Como Executar a Solução Localmente

A pontuação final será calculada somando os critérios obrigatórios e os diferenciais implementados corretamente.
### 4.1 Pré‑requisitos

# Penalizações
- **Docker Desktop** (inclui Docker Compose).
- **Python 3.9+**

Você será desclassificado se:
### 4.2 Clonar o Repositório

1. Enviar uma solução que não funcione.
2. Não cumprir os critérios da seção **Avaliação**.
3. For identificado plágio.

***Que a força esteja com você. Boa sorte!***
```bash
git clone <URL_DO_SEU_REPOSITORIO>
cd <nome_do_seu_repositorio>
```

<div align="left">
</div>
### 4.3 Configurar o PostgreSQL

###
Crie a pasta **postgres_config/** na raiz do projeto contendo:

<br clear="both">
**postgresql.conf**

<div align="center">
<a href="https://www.linkedin.com/school/ledsifes" target="_blank">
<img src="https://img.shields.io/static/v1?message=LinkedIn&logo=linkedin&label=&color=0077B5&logoColor=white&labelColor=&style=for-the-badge" height="40" alt="linkedin logo" />
</a>
<a href="https://www.instagram.com/ledsifes/" target="_blank">
<img src="https://img.shields.io/static/v1?message=Instagram&logo=instagram&label=&color=E4405F&logoColor=white&labelColor=&style=for-the-badge" height="40" alt="instagram logo" />
</a>
<a href="https://www.youtube.com/@ledsifes/?sub_confirmation=1" target="_blank">
<img src="https://img.shields.io/static/v1?message=Youtube&logo=youtube&label=&color=FF0000&logoColor=white&labelColor=&style=for-the-badge" height="40" alt="youtube logo" />
</a>
</div>
```ini
listen_addresses = '*'
```

###
**pg_hba.conf**

```
host processo_seletivo_app admin 0.0.0.0/0 md5
```

### 4.4 Subir o Ambiente

```bash
docker compose up --build -d
```

Isso irá:

1. Construir a imagem da API;
2. Criar contêineres para **Appsmith**, **PostgreSQL** e **API**;
3. Executá‑los em *detached mode*.

### 4.5 Acessar

- **Appsmith**: <http://localhost>
- **API REST** (endpoint de rest): <http://localhost:5000/>


Via `psql` dentro do contêiner:

```bash
docker exec -it <nome_do_container_postgres> psql -U admin -d processo_seletivo_app
```

---

## 5. Uso do Appsmith + Neon DB (Abordagem Cloud)

- **Appsmith Online**: Interface acessível via navegador, conectada ao Neon DB.
- **Neon DB**: PostgreSQL serverless e escalável, com credenciais configuradas diretamente no Appsmith.

Esta abordagem demonstra a flexibilidade do projeto, possibilitando desenvolvimento local e implantação rápida na nuvem.

---

## 6. Estrutura da API REST

A API **não** está incluída neste arquivo para facilitar a leitura.
Abaixo você encontra um **resumo dos endpoints** disponíveis (todos respondem em JSON):

| Método | Rota | Descrição |
| ------ | ---- | --------- |
| `GET` | `/` | Teste de rest da API |
| `GET` | `/concursos` | Lista todos os concursos |
| `GET` | `/concursos/<codigo>` | Detalhes de um concurso |
| `GET` | `/concursos/by_cpf/<cpf>` | Concursos compatíveis com o candidato |
| `POST` | `/concursos` | Cria novo concurso |
| `PUT` | `/concursos/<codigo>` | Atualiza concurso |
| `DELETE` | `/concursos/<codigo>` | Remove concurso |
| `GET` | `/candidatos` | Lista todos os candidatos |
| `GET` | `/candidatos/<cpf>` | Detalhes de um candidato |
| `GET` | `/candidatos/by_codigo_concurso/<codigo>` | Candidatos compatíveis com o concurso |
| `POST` | `/candidatos` | Cria novo candidato |
| `PUT` | `/candidatos/<cpf>` | Atualiza candidato |
| `DELETE` | `/candidatos/<cpf>` | Remove candidato |
| `GET` | `/vagas` | Lista de vagas únicas cadastradas |

---

## 7. Critérios de Avaliação

### 7.1 Legibilidade

- Nomes descritivos para variáveis, funções e endpoints.
- Projeto modular.

### 7.2 Documentação

- Docstrings nos endpoints Flask.
- Comentários explicativos em JS Objects do Appsmith.
- **Dockerfile** e **docker‑compose.yml** comentados.

### 7.3 Tratamento de Erros

- Respostas JSON padronizadas (`400`, `404`, `409`, `500`).
- `try‑except` na API e `showAlert()` no Appsmith.

---

## 8. Diferenciais Implementados

- **API RESTful** separada, seguindo Clean Code.
- **PostgreSQL** local + **Neon DB** na nuvem.
- **Docker** para portabilidade total.
- Abordagem **Low‑Code** com Appsmith acelerando o desenvolvimento.

---

> **Licença**: Este projeto é distribuído sob a licença MIT. Sinta‑se à vontade para usar e contribuir!
98 changes: 98 additions & 0 deletions README_ORIGINAL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# Desafio Low Code - LEDS
*Bem-vindo!* 👋

Neste desafio, você terá a oportunidade de demonstrar que possui as habilidades necessárias para atuar no time de Low/No Code.

# Contextualização

O desafio é desenvolver um sistema em Low/No Code que permita realizar as seguintes buscas:
1. Listar os **órgãos, códigos e editais dos concursos públicos** que se encaixam no perfil do candidato, tomando como base o seu **CPF**;
2. Listar o **nome, data de nascimento e o CPF** dos candidatos que se encaixam no perfil do concurso tomando com base o **Código do Concurso** do concurso público;

O arquivo **candidatos.txt** contém as informações dos candidatos:

| Nome | Data de Nascimento | CPF | Profissões|
|---|---|---|---|
| Lindsey Craft | 19/05/1976 | 182.845.084-34 | [carpinteiro] |
| Jackie Dawson | 14/08/1970 | 311.667.973-47 | [marceneiro, assistente administrativo] |
| Cory Mendoza | 11/02/1957 | 565.512.353-92 | [carpinteiro, marceneiro] |

O arquivo **concursos.txt** contém as informações dos concursos públicos:

| Órgão | Edital | Código do Concurso | Lista de vagas|
|---|---|---|---|
| SEDU | 9/2016 | 61828450843 | [analista de sistemas, marceneiro] |
| SEJUS | 15/2017 | 61828450843 | [carpinteiro,professor de matemática,assistente administrativo] |
| SEJUS | 17/2017 | 95655123539 | [professor de matemática] |

🤩 **As tecnologias a serem utilizadas na implementação da solução ficam a seu critério!**

# Como entregar?
1. Faça um **fork** do repositório. Nesse fork esperamos encontrar uma documentação completa da solução e a listagem dos diferenciais implementados.
2. Abra um **pull request (PR)** do seu fork para o nome repositório com o seu nome como título. Assim conseguimos te localizar melhor e ver que você já finalizou o desafio!

🚨 **Atenção**: você deve enviar apenas o código fonte. Não serão aceitos códigos compilados.

## Avaliação

O programa será avaliado levando em conta os seguintes critérios:

| Critério | Valor |
|---|---|
| Legibilidade do Código | 10 |
| Documentação do código | 10 |
| Documentação da solução | 10 |
| Tratamento de Erros | 10 |
| Total | 40 |

A sua pontuação será a soma dos valores obtidos nos critérios acima.

## Diferenciais
Você pode **aumentar sua pontuação** implementando os seguintes diferenciais:

| Item | Pontos Ganhos |
|---|---|
| Criar um [serviço](https://martinfowler.com/articles/microservices.html) com o problema | 30 |
| Utilizar banco de dados | 30 |
| Implementar Clean Code | 20 |
| Implementar o padrão de programação da tecnologia escolhida | 20 |
| Qualidade de [Código com SonarQube](https://about.sonarcloud.io/) | 15 |
| Implementar testes unitários | 15 |
| Implementar testes comportamentais | 15 |
| Implementar integração com [Github Action](https://github.com/features/actions) | 10 |
| Implementar integração com Github Action + SonarQube | 10 |
| Implementar usando Docker | 5 |
| Total| 170 |

A pontuação final será calculada somando os critérios obrigatórios e os diferenciais implementados corretamente.

# Penalizações

Você será desclassificado se:

1. Enviar uma solução que não funcione.
2. Não cumprir os critérios da seção **Avaliação**.
3. For identificado plágio.

***Que a força esteja com você. Boa sorte!***

<div align="left">
</div>

###

<br clear="both">

<div align="center">
<a href="https://www.linkedin.com/school/ledsifes" target="_blank">
<img src="https://img.shields.io/static/v1?message=LinkedIn&logo=linkedin&label=&color=0077B5&logoColor=white&labelColor=&style=for-the-badge" height="40" alt="linkedin logo" />
</a>
<a href="https://www.instagram.com/ledsifes/" target="_blank">
<img src="https://img.shields.io/static/v1?message=Instagram&logo=instagram&label=&color=E4405F&logoColor=white&labelColor=&style=for-the-badge" height="40" alt="instagram logo" />
</a>
<a href="https://www.youtube.com/@ledsifes/?sub_confirmation=1" target="_blank">
<img src="https://img.shields.io/static/v1?message=Youtube&logo=youtube&label=&color=FF0000&logoColor=white&labelColor=&style=for-the-badge" height="40" alt="youtube logo" />
</a>
</div>

###
16 changes: 16 additions & 0 deletions api_rest/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
FROM python:3.9-slim-buster

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENV PYTHONPATH=/app

EXPOSE 5000

# p/ iniciar a aplicação usando Gunicorn (servidor WSGI)
# usando gunicorn por se recomendado para servir aplicações Flask em produção
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
Loading