Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
3f9b1cb
System added readme file
Jul 8, 2025
c77c00d
System generated commit, initial commit
Jul 8, 2025
77dea4a
Create build.yml
RodolfoVerdandi Jul 8, 2025
95fffd4
Create sonar-project.properties
RodolfoVerdandi Jul 8, 2025
cf4a4f9
Create empty
RodolfoVerdandi Jul 8, 2025
98fc433
Create package.json
RodolfoVerdandi Jul 8, 2025
d7c418a
Create index.js
RodolfoVerdandi Jul 8, 2025
f08ba3f
Create .gitignore
RodolfoVerdandi Jul 8, 2025
c670f41
Create .env
RodolfoVerdandi Jul 8, 2025
6353602
Delete .env
RodolfoVerdandi Jul 8, 2025
fc1d545
Create run-backend.yml
RodolfoVerdandi Jul 8, 2025
006624d
Update package.json
RodolfoVerdandi Jul 8, 2025
cd6c685
Update run-backend.yml
RodolfoVerdandi Jul 8, 2025
aa23a0e
Update run-backend.yml
RodolfoVerdandi Jul 8, 2025
d18bb31
Adiciona teste para rota /concursos
RodolfoVerdandi Jul 8, 2025
56dd1fe
Adiciona workflow de testes com DATABASE_URL
RodolfoVerdandi Jul 8, 2025
facd047
aplicando teste
RodolfoVerdandi Jul 8, 2025
551c6b4
testes correção
RodolfoVerdandi Jul 8, 2025
50c396b
Update run-backend.yml
RodolfoVerdandi Jul 8, 2025
0b10aa0
teste unitario
RodolfoVerdandi Jul 8, 2025
155dfd5
Update run-backend.yml
RodolfoVerdandi Jul 8, 2025
37edaf6
Update index.js
RodolfoVerdandi Jul 8, 2025
abb6b3b
Update package.json
RodolfoVerdandi Jul 8, 2025
c3359b0
Update sonar-project.properties
RodolfoVerdandi Jul 8, 2025
b50ac4c
Update build.yml
RodolfoVerdandi Jul 8, 2025
1cf273c
Update sonar-project.properties
RodolfoVerdandi Jul 8, 2025
27741c4
Update build.yml
RodolfoVerdandi Jul 8, 2025
f9f6b1b
Update package.json
RodolfoVerdandi Jul 8, 2025
c41e36b
Update sonar-project.properties
RodolfoVerdandi Jul 8, 2025
21c2eea
Update sonar-project.properties
RodolfoVerdandi Jul 8, 2025
b3ba622
Update concursos.test.js
RodolfoVerdandi Jul 8, 2025
5b46eaf
Update and rename build.yml to run-sonar.yml
RodolfoVerdandi Jul 8, 2025
7bdc284
Update concursos.test.js
RodolfoVerdandi Jul 8, 2025
8c4dc23
Update concursos.test.js
RodolfoVerdandi Jul 8, 2025
7c36e0a
Create Dockerfile
RodolfoVerdandi Jul 8, 2025
6a440a2
Create .dockerignore
RodolfoVerdandi Jul 8, 2025
dab7230
docker funcionando
RodolfoVerdandi Jul 8, 2025
8837242
Create concursos.behavior.test.js
RodolfoVerdandi Jul 8, 2025
f540efb
Update run-sonar.yml
RodolfoVerdandi Jul 8, 2025
021d9c8
Create concursosPorCapacidadeServer.js
RodolfoVerdandi Jul 8, 2025
e6de3cb
aplicado mvc
RodolfoVerdandi Jul 8, 2025
7473e13
routes adicionados
RodolfoVerdandi Jul 8, 2025
8f980ba
dockerignore atualizado
RodolfoVerdandi Jul 8, 2025
10bb944
comentários adicionados
RodolfoVerdandi Jul 9, 2025
d378a55
Delete empty
RodolfoVerdandi Jul 9, 2025
10259ea
route corrigida no index
RodolfoVerdandi Jul 9, 2025
6a3f482
Rename README.md to README_DO_DESAFIO.md
RodolfoVerdandi Jul 9, 2025
a48a308
Create README.md
RodolfoVerdandi Jul 9, 2025
d1567a6
Update README.md
RodolfoVerdandi Jul 9, 2025
d8de4bd
Update README.md
RodolfoVerdandi Jul 9, 2025
9c99c82
Update README.md
RodolfoVerdandi Jul 9, 2025
1dfb176
Update README.md
RodolfoVerdandi Jul 9, 2025
7cb81a5
não dê ruim, por favor
Jul 8, 2025
228a41d
remoção de queries
Jul 9, 2025
0a94986
comentários adicionados no appsmith
Jul 9, 2025
bafa967
Update README.md
RodolfoVerdandi Jul 9, 2025
17c7b98
Update README.md
RodolfoVerdandi Jul 9, 2025
eb43d30
Update README.md
RodolfoVerdandi Jul 9, 2025
054d9e2
Update README.md
RodolfoVerdandi Jul 9, 2025
bcc0d5c
teste corrigido para codificar url
RodolfoVerdandi Jul 9, 2025
6317ab8
Merge branch 'main' of https://github.com/RodolfoVerdandi/venhaparale…
RodolfoVerdandi Jul 9, 2025
401ca89
Update README.md
RodolfoVerdandi Jul 9, 2025
185a4ce
Update README.md
RodolfoVerdandi Jul 9, 2025
9f6e52f
Update README.md
RodolfoVerdandi Jul 9, 2025
68e77cd
Update README.md
RodolfoVerdandi Jul 9, 2025
6b39a41
Update README.md
RodolfoVerdandi Jul 9, 2025
cdc1b74
Entrega final
Jul 9, 2025
537300d
Update README.md
RodolfoVerdandi Jul 9, 2025
64e7a01
Update README.md
RodolfoVerdandi Jul 9, 2025
09ccaf9
Update README.md
RodolfoVerdandi Jul 9, 2025
fc4d48f
Update README.md
RodolfoVerdandi Jul 9, 2025
3e2dfea
Update README.md
RodolfoVerdandi Jul 9, 2025
5955711
Update README.md
RodolfoVerdandi Jul 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
37 changes: 37 additions & 0 deletions .github/workflows/run-backend.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: Testar Backend

on:
push:
branches:
- main
pull_request:
branches:
- main



jobs:
build:
runs-on: ubuntu-latest
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}

steps:
- uses: actions/checkout@v3

- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 18

- name: Install dependencies
run: npm install
working-directory: backend

- name: Check DATABASE_URL
run: echo "DATABASE_URL is set? ${{ secrets.DATABASE_URL != '' }}"


- name: Run tests
run: npm test
working-directory: backend
31 changes: 31 additions & 0 deletions .github/workflows/run-sonar.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: run-sonar
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened]

jobs:
sonarqube:
name: SonarQube
runs-on: windows-latest
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Instalar dependências
run: npm install
working-directory: backend


- name: Verificar cobertura
run: ls -l backend/coverage

- name: SonarQube Scan
uses: SonarSource/sonarqube-scan-action@v5
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.env
304 changes: 222 additions & 82 deletions README.md

Large diffs are not rendered by default.

109 changes: 109 additions & 0 deletions README_DO_DESAFIO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# 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>

###
![](https://raw.githubusercontent.com/appsmithorg/appsmith/release/static/appsmith_logo_primary.png)

This app is built using Appsmith. Turn any datasource into an internal app in minutes. Appsmith lets you drag-and-drop components to build dashboards, write logic with JavaScript objects and connect to any API, database or GraphQL source.

![](https://raw.githubusercontent.com/appsmithorg/appsmith/release/static/images/integrations.png)

### [Github](https://github.com/appsmithorg/appsmith) • [Docs](https://docs.appsmith.com/?utm_source=github&utm_medium=social&utm_content=appsmith_docs&utm_campaign=null&utm_term=appsmith_docs) • [Community](https://community.appsmith.com/) • [Tutorials](https://github.com/appsmithorg/appsmith/tree/update/readme#tutorials) • [Youtube](https://www.youtube.com/appsmith) • [Discord](https://discord.gg/rBTTVJp)

##### You can visit the application using the below link

###### [![](https://assets.appsmith.com/git-sync/Buttons.svg) ](https://rodolfoverdandi.appsmith.com/applications/686b4a05fe5b092acdedb632/pages/686b4a05fe5b092acdedb635) [![](https://assets.appsmith.com/git-sync/Buttons2.svg)](https://rodolfoverdandi.appsmith.com/applications/686b4a05fe5b092acdedb632/pages/686b4a05fe5b092acdedb635/edit)
46 changes: 46 additions & 0 deletions application.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"appIsExample": false,
"appLayout": {
"type": "FLUID"
},
"applicationDetail": {
"appPositioning": {
"type": "FIXED"
},
"navigationSetting": {},
"themeSetting": {
"appMaxWidth": "LARGE",
"density": 1.0,
"sizing": 1.0
}
},
"applicationVersion": 2,
"collapseInvisibleWidgets": true,
"color": "#EAEDFB",
"evaluationVersion": 2,
"icon": "hat",
"pages": [
{
"id": "Busca por cpf",
"isDefault": true
},
{
"id": "Busca por concurso",
"isDefault": false
}
],
"unpublishedAppLayout": {
"type": "FLUID"
},
"unpublishedApplicationDetail": {
"appPositioning": {
"type": "FIXED"
},
"navigationSetting": {},
"themeSetting": {
"appMaxWidth": "LARGE",
"density": 1.0,
"sizing": 1.0
}
}
}
7 changes: 7 additions & 0 deletions backend/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore
.env
21 changes: 21 additions & 0 deletions backend/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Etapa 1: usar imagem base do Node.js
FROM node:18

# Diretório de trabalho no container
WORKDIR /app

# Copia arquivos de dependência e instala pacotes
COPY package*.json ./
RUN npm install

# Copia o restante dos arquivos da aplicação
COPY . .

# Define variável de ambiente (ajustável)
ENV NODE_ENV=production

# Expõe a porta (a mesma usada no app.listen)
EXPOSE 3000

# Comando para iniciar o app
CMD [ "npm", "start" ]
33 changes: 33 additions & 0 deletions backend/__tests__/concursos.behavior.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
const request = require('supertest');
const app = require('../index');

describe('Teste comportamental da rota /concursos', () => {
it('deve retornar concursos com a capacidade "padeiro"', async () => {
const res = await request(app).get('/concursos?capacidades=padeiro');

expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body)).toBe(true);

const contem = res.body.some(c => c.lista_de_vagas.includes('padeiro'));
expect(contem).toBe(true);
});

it('deve retornar concursos com a capacidade "professor de matemática"', async () => {
const capacidade = encodeURIComponent('professor de matemática');
const res = await request(app).get(`/concursos?capacidades=${capacidade}`);

expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body)).toBe(true);

const contem = res.body.some(c => c.lista_de_vagas.includes('professor de matemática'));
expect(contem).toBe(true);
});

it('deve retornar array vazio quando não houver nenhuma correspondência', async () => {
const res = await request(app).get('/concursos?capacidades=inexistente');

expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body)).toBe(true);
expect(res.body.length).toBe(0);
});
});
10 changes: 10 additions & 0 deletions backend/__tests__/concursos.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const request = require('supertest');
const app = require('../index');

describe('GET /concursos', () => {
it('deve retornar 200 e um array', async () => {
const res = await request(app).get('/concursos?capacidades=marceneiro');
expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body)).toBe(true);
});
});
28 changes: 28 additions & 0 deletions backend/coverage/clover.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<coverage generated="1752002556253" clover="3.2.0">
<project timestamp="1752002556253" name="All files">
<metrics statements="19" coveredstatements="14" conditionals="4" coveredconditionals="2" methods="2" coveredmethods="1" elements="25" coveredelements="17" complexity="0" loc="19" ncloc="19" packages="1" files="1" classes="1"/>
<file name="index.js" path="/workspaces/venhaparaleds-lowcode/backend/index.js">
<metrics statements="19" coveredstatements="14" conditionals="4" coveredconditionals="2" methods="2" coveredmethods="1"/>
<line num="1" count="1" type="stmt"/>
<line num="2" count="1" type="stmt"/>
<line num="3" count="1" type="stmt"/>
<line num="5" count="1" type="stmt"/>
<line num="7" count="1" type="stmt"/>
<line num="12" count="1" type="stmt"/>
<line num="13" count="1" type="stmt"/>
<line num="14" count="1" type="stmt"/>
<line num="15" count="1" type="stmt"/>
<line num="16" count="1" type="stmt"/>
<line num="18" count="1" type="cond" truecount="1" falsecount="1"/>
<line num="20" count="0" type="stmt"/>
<line num="21" count="0" type="stmt"/>
<line num="22" count="0" type="stmt"/>
<line num="25" count="1" type="stmt"/>
<line num="26" count="1" type="stmt"/>
<line num="28" count="0" type="stmt"/>
<line num="29" count="0" type="stmt"/>
<line num="33" count="1" type="stmt"/>
</file>
</project>
</coverage>
2 changes: 2 additions & 0 deletions backend/coverage/coverage-final.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{"/workspaces/venhaparaleds-lowcode/backend/index.js": {"path":"/workspaces/venhaparaleds-lowcode/backend/index.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":17},"end":{"line":2,"column":30}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":27}},"3":{"start":{"line":5,"column":12},"end":{"line":5,"column":21}},"4":{"start":{"line":7,"column":13},"end":{"line":10,"column":2}},"5":{"start":{"line":12,"column":0},"end":{"line":31,"column":3}},"6":{"start":{"line":13,"column":2},"end":{"line":30,"column":3}},"7":{"start":{"line":14,"column":28},"end":{"line":14,"column":37}},"8":{"start":{"line":15,"column":16},"end":{"line":15,"column":43}},"9":{"start":{"line":16,"column":17},"end":{"line":16,"column":19}},"10":{"start":{"line":18,"column":4},"end":{"line":23,"column":5}},"11":{"start":{"line":20,"column":31},"end":{"line":20,"column":72}},"12":{"start":{"line":20,"column":63},"end":{"line":20,"column":71}},"13":{"start":{"line":21,"column":6},"end":{"line":21,"column":53}},"14":{"start":{"line":22,"column":6},"end":{"line":22,"column":36}},"15":{"start":{"line":25,"column":19},"end":{"line":25,"column":50}},"16":{"start":{"line":26,"column":4},"end":{"line":26,"column":38}},"17":{"start":{"line":28,"column":4},"end":{"line":28,"column":54}},"18":{"start":{"line":29,"column":4},"end":{"line":29,"column":66}},"19":{"start":{"line":33,"column":0},"end":{"line":33,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":12,"column":22},"end":{"line":12,"column":23}},"loc":{"start":{"line":12,"column":42},"end":{"line":31,"column":1}},"line":12},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":58},"end":{"line":20,"column":59}},"loc":{"start":{"line":20,"column":63},"end":{"line":20,"column":71}},"line":20}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":7},"end":{"line":9,"column":84}},"type":"cond-expr","locations":[{"start":{"line":9,"column":47},"end":{"line":9,"column":76}},{"start":{"line":9,"column":79},"end":{"line":9,"column":84}}],"line":9},"1":{"loc":{"start":{"line":18,"column":4},"end":{"line":23,"column":5}},"type":"if","locations":[{"start":{"line":18,"column":4},"end":{"line":23,"column":5}},{"start":{},"end":{}}],"line":18}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":0,"12":0,"13":0,"14":0,"15":1,"16":1,"17":0,"18":0,"19":1},"f":{"0":1,"1":0},"b":{"0":[0,1],"1":[0,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"105c5296cea6f50eb9eb3316d1acc832fb8b9896"}
}
Loading