From 03a288010f4390be257263903e57f5bd98d02c7d Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:20:25 -0300 Subject: [PATCH 01/16] chore: Movendo rotas descontinuadas para 'deprecated' --- backend/{src => [deprecated]}/routes/citiesRoutes.js | 0 backend/{src => [deprecated]}/routes/tendersRoutes.js | 0 backend/{src => [deprecated]}/routes/unitsRoutes.js | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename backend/{src => [deprecated]}/routes/citiesRoutes.js (100%) rename backend/{src => [deprecated]}/routes/tendersRoutes.js (100%) rename backend/{src => [deprecated]}/routes/unitsRoutes.js (100%) diff --git a/backend/src/routes/citiesRoutes.js b/backend/[deprecated]/routes/citiesRoutes.js similarity index 100% rename from backend/src/routes/citiesRoutes.js rename to backend/[deprecated]/routes/citiesRoutes.js diff --git a/backend/src/routes/tendersRoutes.js b/backend/[deprecated]/routes/tendersRoutes.js similarity index 100% rename from backend/src/routes/tendersRoutes.js rename to backend/[deprecated]/routes/tendersRoutes.js diff --git a/backend/src/routes/unitsRoutes.js b/backend/[deprecated]/routes/unitsRoutes.js similarity index 100% rename from backend/src/routes/unitsRoutes.js rename to backend/[deprecated]/routes/unitsRoutes.js From b6b0970f08414aaded0a776e5bdf72aadbbcc4f7 Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:22:56 -0300 Subject: [PATCH 02/16] chore: Movendo controladores descontinuados para 'deprecated' --- backend/{src => [deprecated]}/controllers/citiesController.js | 0 backend/{src => [deprecated]}/controllers/tendersController.js | 0 backend/{src => [deprecated]}/controllers/unitsController.js | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename backend/{src => [deprecated]}/controllers/citiesController.js (100%) rename backend/{src => [deprecated]}/controllers/tendersController.js (100%) rename backend/{src => [deprecated]}/controllers/unitsController.js (100%) diff --git a/backend/src/controllers/citiesController.js b/backend/[deprecated]/controllers/citiesController.js similarity index 100% rename from backend/src/controllers/citiesController.js rename to backend/[deprecated]/controllers/citiesController.js diff --git a/backend/src/controllers/tendersController.js b/backend/[deprecated]/controllers/tendersController.js similarity index 100% rename from backend/src/controllers/tendersController.js rename to backend/[deprecated]/controllers/tendersController.js diff --git a/backend/src/controllers/unitsController.js b/backend/[deprecated]/controllers/unitsController.js similarity index 100% rename from backend/src/controllers/unitsController.js rename to backend/[deprecated]/controllers/unitsController.js From 905f40bb26946448f2509c20a5746e0c2f3c65a7 Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:29:49 -0300 Subject: [PATCH 03/16] =?UTF-8?q?chore:=20Movendo=20servi=C3=A7os=20descon?= =?UTF-8?q?tinuados=20para=20'deprecated'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/{src => [deprecated]}/services/citiesService.js | 2 +- backend/{src => [deprecated]}/services/tendersService.js | 2 +- backend/{src => [deprecated]}/services/unitsService.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename backend/{src => [deprecated]}/services/citiesService.js (80%) rename backend/{src => [deprecated]}/services/tendersService.js (90%) rename backend/{src => [deprecated]}/services/unitsService.js (81%) diff --git a/backend/src/services/citiesService.js b/backend/[deprecated]/services/citiesService.js similarity index 80% rename from backend/src/services/citiesService.js rename to backend/[deprecated]/services/citiesService.js index fb459be..030d6be 100644 --- a/backend/src/services/citiesService.js +++ b/backend/[deprecated]/services/citiesService.js @@ -1,4 +1,4 @@ -const supabase = require('../config/supabaseClient') +const supabase = require('../../src/config/supabaseClient') async function getAllCities() { const { data, error } = await supabase diff --git a/backend/src/services/tendersService.js b/backend/[deprecated]/services/tendersService.js similarity index 90% rename from backend/src/services/tendersService.js rename to backend/[deprecated]/services/tendersService.js index bd5d281..3e6f402 100644 --- a/backend/src/services/tendersService.js +++ b/backend/[deprecated]/services/tendersService.js @@ -1,4 +1,4 @@ -const supabase = require('../config/supabaseClient'); +const supabase = require('../../src/config/supabaseClient'); async function getTendersByCityAndDate(start, end, cityId) { const startAno = Math.floor(start / 100) % 100; // Extrai os últimos dois dígitos do ano diff --git a/backend/src/services/unitsService.js b/backend/[deprecated]/services/unitsService.js similarity index 81% rename from backend/src/services/unitsService.js rename to backend/[deprecated]/services/unitsService.js index 9e9bd77..b447cea 100644 --- a/backend/src/services/unitsService.js +++ b/backend/[deprecated]/services/unitsService.js @@ -1,4 +1,4 @@ -const supabase = require('../config/supabaseClient') +const supabase = require('../../src/config/supabaseClient') async function getAllUnits() { const { data, error } = await supabase From cf006ae33228e009eeca5b453a3b0a5b50e89091 Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:30:58 -0300 Subject: [PATCH 04/16] chore: Renomeando index.js -> server.js --- backend/src/{index.js => server.js} | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) rename backend/src/{index.js => server.js} (57%) diff --git a/backend/src/index.js b/backend/src/server.js similarity index 57% rename from backend/src/index.js rename to backend/src/server.js index 54e1008..b7aa622 100644 --- a/backend/src/index.js +++ b/backend/src/server.js @@ -4,18 +4,23 @@ const cors = require('cors'); const app = express(); const port = 5000; -const citiesRoutes = require('./routes/citiesRoutes'); +// * [Deprecated] * +// const citiesRoutes = require('./routes/citiesRoutes'); +// const unitsRoutes = require('./routes/unitsRoutes'); + const tendersMonthRoutes = require('./routes/tendersMonthRoutes'); const tendersYearRoutes = require('./routes/tendersYearRoutes'); -const tendersRoutes = require('./routes/tendersRoutes'); -const unitsRoutes = require('./routes/unitsRoutes'); +const healthRoutes = require('./routes/healthRoutes'); app.use(cors()) -app.use('/cities', citiesRoutes) +// * [Deprecated] * +// app.use('/cities', citiesRoutes) +// app.use('/units', unitsRoutes) + app.use('/tenders', tendersMonthRoutes) app.use('/tenders/year', tendersYearRoutes) -app.use('/units', unitsRoutes) +app.use('/health', healthRoutes) app.listen(port, () => { console.log(`API running at http://localhost:${port}`) From 5d1dbc4fbe164e4195fc7f67f246a12d08f4eb74 Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:33:22 -0300 Subject: [PATCH 05/16] chore: Movendo scripts descontinuados para 'deprecated' --- backend/{src => [deprecated]}/scripts/insertData.js | 0 backend/{src => [deprecated]}/scripts/insertInitialData.js | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename backend/{src => [deprecated]}/scripts/insertData.js (100%) rename backend/{src => [deprecated]}/scripts/insertInitialData.js (100%) diff --git a/backend/src/scripts/insertData.js b/backend/[deprecated]/scripts/insertData.js similarity index 100% rename from backend/src/scripts/insertData.js rename to backend/[deprecated]/scripts/insertData.js diff --git a/backend/src/scripts/insertInitialData.js b/backend/[deprecated]/scripts/insertInitialData.js similarity index 100% rename from backend/src/scripts/insertInitialData.js rename to backend/[deprecated]/scripts/insertInitialData.js From 49696be54e4b3fb73da911f131b9ef957e148c45 Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:38:58 -0300 Subject: [PATCH 06/16] chore: Movendo testes descontinuados para 'deprecated' --- .../tests/citiesAPI.js} | 0 .../tests/unitsAPI.js} | 0 backend/__tests__/tendersAPI.spec.js | 47 ------------------- 3 files changed, 47 deletions(-) rename backend/{__tests__/citiesAPI.spec.js => [deprecated]/tests/citiesAPI.js} (100%) rename backend/{__tests__/unitsAPI.spec.js => [deprecated]/tests/unitsAPI.js} (100%) delete mode 100644 backend/__tests__/tendersAPI.spec.js diff --git a/backend/__tests__/citiesAPI.spec.js b/backend/[deprecated]/tests/citiesAPI.js similarity index 100% rename from backend/__tests__/citiesAPI.spec.js rename to backend/[deprecated]/tests/citiesAPI.js diff --git a/backend/__tests__/unitsAPI.spec.js b/backend/[deprecated]/tests/unitsAPI.js similarity index 100% rename from backend/__tests__/unitsAPI.spec.js rename to backend/[deprecated]/tests/unitsAPI.js diff --git a/backend/__tests__/tendersAPI.spec.js b/backend/__tests__/tendersAPI.spec.js deleted file mode 100644 index e40e947..0000000 --- a/backend/__tests__/tendersAPI.spec.js +++ /dev/null @@ -1,47 +0,0 @@ -const request = require('supertest'); -const app = 'http://localhost:5000'; - -describe('Testes do Endpoint de Licitações', () => { - it('Deve retornar licitações para a cidade específica no intervalo de tempo fornecido', async () => { - const startYear = '23'; - const startMonth = '01'; - const endYear = '23'; - const endMonth = '06'; - const cityId = 1; - - const res = await request(app) - .get(`/tenders?start=${startYear}${startMonth}&end=${endYear}${endMonth}&city=${cityId}`) - .expect('Content-Type', /json/) - .expect(200); - - expect(res.status).toBe(200); - expect(res.body).toBeDefined(); - expect(Array.isArray(res.body)).toBe(true); - - res.body.forEach(tender => { - expect(tender).toHaveProperty('id'); - expect(tender).toHaveProperty('administrative_unit_id'); - expect(tender).toHaveProperty('city_id'); - expect(tender).toHaveProperty('committed_value'); - expect(tender).toHaveProperty('liquidated_value'); - expect(tender).toHaveProperty('paid_value'); - expect(tender).toHaveProperty('year'); - expect(tender).toHaveProperty('month'); - expect(typeof tender.id).toBe('number'); - expect(typeof tender.administrative_unit_id).toBe('number'); - }); - }); - - it('Deve retornar um erro quando a cidade não for fornecida', async () => { - const startYear = '23'; - const startMonth = '01'; - const endYear = '23'; - const endMonth = '06'; - - const res = await request(app) - .get(`/tenders?start=${startYear}${startMonth}&end=${endYear}${endMonth}`); - - expect(res.status).toBe(400); - expect(res.body).toBeDefined(); - }); -}); From 6110c5c7e58021238eec79788149ab68e908413f Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:39:54 -0300 Subject: [PATCH 07/16] =?UTF-8?q?test:=20Adicionando=20teste=20de=20integr?= =?UTF-8?q?a=C3=A7=C3=A3o=20do=20endpoint=20/health?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/__tests__/health.spec.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 backend/__tests__/health.spec.js diff --git a/backend/__tests__/health.spec.js b/backend/__tests__/health.spec.js new file mode 100644 index 0000000..10b0829 --- /dev/null +++ b/backend/__tests__/health.spec.js @@ -0,0 +1,15 @@ +const request = require('supertest'); +const app = 'https://minas-cultura-api.onrender.com'; + +describe('Testes do Endpoint de Health', () => { + it('Deve retornar "OK"', async () => { + + const res = await request(app) + .get(`/health`) + .expect('Content-Type', /json/) + .expect(200); + + expect(res.status).toBe(200); + expect(res.body).toBeDefined(); + }); + }); From befcdb064135e922c29a3c209213388685cceac3 Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:40:34 -0300 Subject: [PATCH 08/16] =?UTF-8?q?test:=20Refatorando=20teste=20de=20integr?= =?UTF-8?q?a=C3=A7=C3=A3o=20do=20endpoint=20de=20licita=C3=A7=C3=B5es=20me?= =?UTF-8?q?nsais?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/__tests__/tendersMonth.spec.js | 38 ++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 backend/__tests__/tendersMonth.spec.js diff --git a/backend/__tests__/tendersMonth.spec.js b/backend/__tests__/tendersMonth.spec.js new file mode 100644 index 0000000..f60fe68 --- /dev/null +++ b/backend/__tests__/tendersMonth.spec.js @@ -0,0 +1,38 @@ +const request = require('supertest'); +const app = 'https://minas-cultura-api.onrender.com'; + +describe('Testes do Endpoint de Licitações Mensais', () => { + it('Deve retornar licitações no intervalo de tempo fornecido', async () => { + const startYear = '2023'; + const startMonth = '01'; + const endYear = '2023'; + const endMonth = '06'; + + const res = await request(app) + .get(`/tenders?start=${startYear}${startMonth}&end=${endYear}${endMonth}`) + .expect('Content-Type', /json/) + .expect(200); + + expect(res.status).toBe(200); + expect(res.body).toBeDefined(); + expect(Array.isArray(res.body)).toBe(true); + + res.body.forEach(tender => { + expect(tender).toHaveProperty('id'); + expect(tender).toHaveProperty('committed_value'); + expect(tender).toHaveProperty('liquidated_value'); + expect(tender).toHaveProperty('paid_value'); + expect(tender).toHaveProperty('year'); + expect(tender).toHaveProperty('month'); + }); + }); + + it('Deve retornar um erro quando a data não for fornecida', async () => { + + const res = await request(app) + .get(`/tenders?start=&end=`); + + expect(res.status).toBe(400); + expect(res.body).toBeDefined(); + }); +}); From dd219f50ae1e84ebe73823a39d8492a730a49a4e Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:41:01 -0300 Subject: [PATCH 09/16] =?UTF-8?q?test:=20Adicionando=20teste=20de=20integr?= =?UTF-8?q?a=C3=A7=C3=A3o=20do=20endpoint=20de=20licita=C3=A7=C3=B5es=20an?= =?UTF-8?q?uais?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/__tests__/tendersYear.spec.js | 34 +++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 backend/__tests__/tendersYear.spec.js diff --git a/backend/__tests__/tendersYear.spec.js b/backend/__tests__/tendersYear.spec.js new file mode 100644 index 0000000..bce12d4 --- /dev/null +++ b/backend/__tests__/tendersYear.spec.js @@ -0,0 +1,34 @@ +const request = require('supertest'); +const app = 'https://minas-cultura-api.onrender.com'; + +describe('Testes do Endpoint de Licitações Anuais', () => { + it('Deve retornar a licitação referente ao ano fornecido', async () => { + const year = '2023'; + + const res = await request(app) + .get(`/tenders/year?year=${year}`) + .expect('Content-Type', /json/) + .expect(200); + + expect(res.status).toBe(200); + expect(res.body).toBeDefined(); + expect(Array.isArray(res.body)).toBe(true); + + res.body.forEach(tender => { + expect(tender).toHaveProperty('committed_value'); + expect(tender).toHaveProperty('liquidated_value'); + expect(tender).toHaveProperty('paid_value'); + expect(tender).toHaveProperty('year'); + }); + }); + + it('Deve retornar um erro quando a data não for fornecida', async () => { + const year = null; + + const res = await request(app) + .get(`/tenders/year?year=${year}`); + + expect(res.status).toBe(400); + expect(res.body).toBeDefined(); + }); +}); From 6e9b328201514af9badec3023086d751bffdc740 Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:41:40 -0300 Subject: [PATCH 10/16] =?UTF-8?q?feat:=20Adicionando=20endpoint=20que=20ve?= =?UTF-8?q?rifica=20a=20sa=C3=BAde=20da=20aplica=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/routes/healthRoutes.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 backend/src/routes/healthRoutes.js diff --git a/backend/src/routes/healthRoutes.js b/backend/src/routes/healthRoutes.js new file mode 100644 index 0000000..b64a066 --- /dev/null +++ b/backend/src/routes/healthRoutes.js @@ -0,0 +1,16 @@ +const express = require('express'); +const router = express.Router(); + +router.get('/', async (_req, res, _next) => { + const healthcheck = { + message: 'OK' + }; + try { + res.send(healthcheck); + } catch (error) { + healthcheck.message = error; + res.status(503).send(); + } +}); + +module.exports = router; From e542001e96f34d19f03964a4257ac70654f51ab6 Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:43:30 -0300 Subject: [PATCH 11/16] =?UTF-8?q?fix:=20Corrigindo=20bug=20no=20servi?= =?UTF-8?q?=C3=A7o=20de=20licita=C3=A7=C3=B5es=20mensais?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/services/tendersMonthService.js | 28 ++++++++++++++------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/backend/src/services/tendersMonthService.js b/backend/src/services/tendersMonthService.js index 1f25a3b..dd05437 100644 --- a/backend/src/services/tendersMonthService.js +++ b/backend/src/services/tendersMonthService.js @@ -6,14 +6,23 @@ async function getTendersByMonth(start, end) { const endYear = Math.floor(end / 100); const endMonth = end % 100; - const { data, error } = await supabase - .from('tendersmonth') - .select('*') - .or( - `and(year.eq.${startYear},month.gte.${startMonth}),` + - `and(year.gt.${startYear},year.lt.${endYear}),` + - `and(year.eq.${endYear},month.lte.${endMonth})` - ); + let query = supabase.from('tendersmonth').select('*'); + + if (startYear === endYear) { + query = query + .eq('year', startYear) + .gte('month', startMonth) + .lte('month', endMonth); + } else { + query = query + .or( + `and(year.eq.${startYear},month.gte.${startMonth}),` + + `and(year.eq.${endYear},month.lte.${endMonth}),` + + `and(year.gt.${startYear},year.lt.${endYear})` + ); + } + + const { data, error } = await query; if (error) { throw new Error(error.message); @@ -24,4 +33,5 @@ async function getTendersByMonth(start, end) { module.exports = { getTendersByMonth, -}; \ No newline at end of file +}; + From 73bec88609886446f52119a46720e36f08b8a7ce Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:44:35 -0300 Subject: [PATCH 12/16] =?UTF-8?q?docs:=20Adicionando=20documenta=C3=A7?= =?UTF-8?q?=C3=A3o=20da=20modelagem=20do=20banco=20de=20dados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "docs/vis\303\243o geral/modelagem_banco.md" | 43 +++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git "a/docs/vis\303\243o geral/modelagem_banco.md" "b/docs/vis\303\243o geral/modelagem_banco.md" index d87cb26..48643a3 100644 --- "a/docs/vis\303\243o geral/modelagem_banco.md" +++ "b/docs/vis\303\243o geral/modelagem_banco.md" @@ -1 +1,42 @@ -# Modelagem do banco \ No newline at end of file +# Modelagem do Banco de Dados + +## Visão Geral + +O banco de dados é composto por duas tabelas principais que armazenam informações sobre licitações culturais: uma com dados mensais (`tendersmonth`) e outra com dados anuais (`tendersyear`). Atualmente, as tabelas não possuem relações entre si. + +## Descrição das Tabelas + +### Tabela `tendersmonth` + +A tabela `tendersmonth` armazena informações detalhadas sobre as licitações culturais de Minas Gerais organizadas por mês. + +| Coluna | Tipo de Dado | Descrição | Restrição | +|--------------------|--------------|-----------------------------------------------------|----------------| +| `id` | `int4` | Identificador único da licitação mensal | **Primary Key**| +| `commited_value` | `numeric` | Valor comprometido para a licitação naquele mês | | +| `liquidated_value` | `numeric` | Valor liquidado da licitação naquele mês | | +| `paid_value` | `numeric` | Valor pago da licitação naquele mês | | +| `year` | `int4` | Ano da licitação | **NOT NULL** | +| `month` | `int4` | Mês da licitação | **NOT NULL** | + +### Tabela `tendersyear` + +A tabela `tendersyear` armazena informações consolidadas das licitações culturais de Minas Gerais por ano. + +| Coluna | Tipo de Dado | Descrição | Restrição | +|--------------------|--------------|-----------------------------------------------------|----------------| +| `id` | `int4` | Identificador único da licitação anual | **Primary Key**| +| `commited_value` | `numeric` | Valor comprometido total para a licitação no ano | | +| `liquidated_value` | `numeric` | Valor liquidado total da licitação no ano | | +| `paid_value` | `numeric` | Valor pago total da licitação no ano | | +| `year` | `int4` | Ano da licitação | **NOT NULL** | + +## Exemplos de Consultas + +```sql +-- Seleciona todas as licitações mensais para o ano de 2023 +SELECT * FROM tendersmonth WHERE year = 2023; + +-- Seleciona todas as licitações anuais com valor pago superior a 100000 +SELECT * FROM tendersyear WHERE paid_value > 100000; +``` \ No newline at end of file From 06bccda7626a73be8a01d7aa389d62965b021a5d Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:45:30 -0300 Subject: [PATCH 13/16] =?UTF-8?q?docs:=20Adicionando=20altera=C3=A7=C3=B5e?= =?UTF-8?q?s=20relacionadas=20ao=20backend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Arquitetura/Arquitetura.md | 12 +++++++++--- docs/Como executar/backend/Executar a API.md | 20 +++++++++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/docs/Arquitetura/Arquitetura.md b/docs/Arquitetura/Arquitetura.md index e7653f2..39106ae 100644 --- a/docs/Arquitetura/Arquitetura.md +++ b/docs/Arquitetura/Arquitetura.md @@ -18,11 +18,15 @@ O deploy do frontend foi realizado na **Vercel**, uma plataforma otimizada para ## Backend -O backend do projeto é uma **API REST** desenvolvida com **Express.js**, um framework minimalista para Node.js. Essa API é responsável por gerenciar as requisições dos usuários e interagir com o banco de dados **PostgreSQL**. Utilizamos **pgAdmin** para facilitar a administração e o gerenciamento do banco de dados. +O backend do projeto é uma **API REST** desenvolvida com [**Express.js**](https://expressjs.com/), um framework minimalista para [**Node.js**](https://nodejs.org/). Esta API é responsável por gerenciar as requisições dos usuários e interagir com o banco de dados [**PostgreSQL**](https://www.postgresql.org/). + +Inicialmente, utilizamos um container de **PostgreSQL** junto com o [**pgAdmin**](https://www.pgadmin.org/) para facilitar a administração e o gerenciamento do banco de dados durante a fase inicial de desenvolvimento. Posteriormente, migramos para o [**Supabase**](https://supabase.com/), que oferece uma solução gerenciada de PostgreSQL com funcionalidades adicionais para desenvolvimento de aplicações web. ### Deploy do Backend -O deploy da nossa API foi realizado no **Render**, uma plataforma de cloud que oferece deploys automáticos a partir de repositórios Git, suporte a SSL automático e escalabilidade fácil. O Render foi escolhido por sua simplicidade e robustez, permitindo que a API esteja sempre disponível e pronta para responder às requisições com alta performance. +O deploy da nossa API foi realizado no [**Render**](https://render.com/), uma plataforma de cloud que oferece **deploys automáticos** a partir de repositórios Git, suporte a **SSL automático** e **escalabilidade fácil**. Escolhemos o Render por sua simplicidade e robustez. No entanto, enfrentamos alguns desafios, pois o plano gratuito do Render limita o tempo em que a aplicação permanece ativa quando não está em uso, resultando em períodos de inatividade (downtime). + +Para contornar essa limitação, utilizamos outra plataforma chamada [**BetterStack**](https://betterstack.com/), que monitora a aplicação em intervalos regulares. Implementamos um endpoint específico `/health` que verifica a saúde da aplicação a cada 10 minutos. Dessa forma, garantimos que a API esteja sempre disponível e pronta para responder às requisições, mantendo alta performance e evitando o downtime. ## Banco de Dados @@ -53,14 +57,16 @@ Abaixo estão as principais tecnologias que compõem o projeto: - **Linguagens de Programação**: [Python](https://docs.python.org/3/), [JavaScript](https://www.javascript.com/), [TypeScript](https://www.typescriptlang.org/) - **Framework Web**: [Next.js](https://nextjs.org/) -- **Banco de Dados**: [PostgreSQL](https://www.postgresql.org/) +- **Banco de Dados**: [PostgreSQL](https://www.postgresql.org/) e [Supabase](https://supabase.com/) - **Ferramentas de Coleta de Dados**: Framework [Scrapy](https://scrapy.org/) com auxílio das bibliotecas [Beautiful Soup](https://beautiful-soup-4.readthedocs.io/en/latest/) e [Selenium](https://www.selenium.dev/) +- **Testes**: [Jest](https://jestjs.io/pt-BR/) e [Supertest](https://github.com/ladjs/supertest) - **Tecnologias Adicionais**: [Docker](https://www.docker.com/), [Express](https://expressjs.com/), [React](https://react.dev/), [Tailwind CSS](https://tailwindcss.com/) ## 📁 Histórico de Versão | Versão | Data | Descrição | Autor | | :----: | :--------: | :------------------------------------------------------------------------------: | :-------------: | +| 6.0 | 03/09/2024 | Detalhamento do backend | Isaac Batista| | 5.0 | 02/09/2024 | Reestruturação da arquitetura | Gabriel Scheidt| | 4.0 | 16/08/2024 | Reestruturação da arquitetura | Gabriel Scheidt| | 3.0 | 25/04/2024 | Reestruturando Documento de Arquitetura | Rafael Carvalho | diff --git a/docs/Como executar/backend/Executar a API.md b/docs/Como executar/backend/Executar a API.md index 4985483..9c75638 100644 --- a/docs/Como executar/backend/Executar a API.md +++ b/docs/Como executar/backend/Executar a API.md @@ -1,8 +1,11 @@ -## **Guia de Utilização da API de Licitações Culturais de Minas Gerais** +# Como utilizar o Back-end do projeto ### **Visão Geral** -Esta API permite consultar informações relacionadas a licitações culturais de Minas Gerais. A API foi desenvolvida utilizando Express.js e está organizada em três camadas principais: `models`, `services` e `controllers`. Abaixo, você encontrará a descrição dos endpoints disponíveis e como utilizá-los. +Esta API permite consultar informações sobre licitações culturais em Minas Gerais. Embora o código-fonte da API esteja disponível em nosso repositório, o acesso ao banco de dados principal é restrito. No entanto, você pode acessar a API publicamente através da seguinte URL: [https://minas-cultura-api.onrender.com](https://minas-cultura-api.onrender.com). + + +A API foi desenvolvida utilizando Express.js e está organizada em três camadas principais: `models`, `services` e `controllers`. Abaixo, você encontrará a descrição dos endpoints disponíveis e como utilizá-los. ### **Estrutura da API** @@ -10,13 +13,14 @@ A API está localizada no diretório `backend/src/`, e é composta por três end 1. **/tenders** 2. **/tenders/year** +3. **/health** ### **Endpoints** #### **1. Consultar Licitações Mensais: `/tenders`** - **Descrição:** Retorna uma lista de licitações baseadas nos parâmetros de data inicial e final. -- **URL:** `http://localhost:5000/tenders?start=201501&end=201502` +- **URL:** `https://minas-cultura-api.onrender.com/tenders?start=201501&end=201502` - **Método:** `GET` - **Parâmetros:** - `start`: Representa o início do período de consulta no formato `AAAAMM` (ano/mês). Por exemplo, `201501` corresponde a janeiro de 2015. @@ -25,15 +29,17 @@ A API está localizada no diretório `backend/src/`, e é composta por três end #### **2. Consultar Licitações Anuais: `/tenders/year`** - **Descrição:** Retorna os valores totais empenhados, liquidados e pagos no ano informado no parâmetro "year". -- **URL:** `http://localhost:5000/tenders/year?year=2024` +- **URL:** `https://minas-cultura-api.onrender.com/tenders/year?year=2024` - **Método:** `GET` - **Parâmetros:** - `year`: Representa o ano de consulta no formato `AAAA` (ano). Por exemplo, `year=2024` retornará o total de licitações empenhadas, liquidadas e pagas no ano de 2024. +#### **3. Consultar a saúde da aplicação: `/health`** + +- **Descrição:** Retorna a mensagem "OK" em caso de sucesso na conexão com a api, este endpoint é necessário para monitorar a estabilidade do sistema. +- **URL:** `https://minas-cultura-api.onrender.com/health` +- **Método:** `GET` -### **Considerações Importantes** -- **Porta:** A API está configurada para rodar na porta `5000`. ---- Siga este guia para consultar e explorar as licitações culturais de Minas Gerais. Caso tenha dúvidas ou precise de suporte adicional, entre em contato com o time de desenvolvimento. \ No newline at end of file From 098f99db30ac3c83c240575ff9b83a4b2d6301c5 Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:46:22 -0300 Subject: [PATCH 14/16] =?UTF-8?q?docs:=20Adicionando=20uma=20explica=C3=A7?= =?UTF-8?q?=C3=A3o=20mais=20detalhada=20ao=20backend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/README.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/backend/README.md b/backend/README.md index 4985483..9c75638 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1,8 +1,11 @@ -## **Guia de Utilização da API de Licitações Culturais de Minas Gerais** +# Como utilizar o Back-end do projeto ### **Visão Geral** -Esta API permite consultar informações relacionadas a licitações culturais de Minas Gerais. A API foi desenvolvida utilizando Express.js e está organizada em três camadas principais: `models`, `services` e `controllers`. Abaixo, você encontrará a descrição dos endpoints disponíveis e como utilizá-los. +Esta API permite consultar informações sobre licitações culturais em Minas Gerais. Embora o código-fonte da API esteja disponível em nosso repositório, o acesso ao banco de dados principal é restrito. No entanto, você pode acessar a API publicamente através da seguinte URL: [https://minas-cultura-api.onrender.com](https://minas-cultura-api.onrender.com). + + +A API foi desenvolvida utilizando Express.js e está organizada em três camadas principais: `models`, `services` e `controllers`. Abaixo, você encontrará a descrição dos endpoints disponíveis e como utilizá-los. ### **Estrutura da API** @@ -10,13 +13,14 @@ A API está localizada no diretório `backend/src/`, e é composta por três end 1. **/tenders** 2. **/tenders/year** +3. **/health** ### **Endpoints** #### **1. Consultar Licitações Mensais: `/tenders`** - **Descrição:** Retorna uma lista de licitações baseadas nos parâmetros de data inicial e final. -- **URL:** `http://localhost:5000/tenders?start=201501&end=201502` +- **URL:** `https://minas-cultura-api.onrender.com/tenders?start=201501&end=201502` - **Método:** `GET` - **Parâmetros:** - `start`: Representa o início do período de consulta no formato `AAAAMM` (ano/mês). Por exemplo, `201501` corresponde a janeiro de 2015. @@ -25,15 +29,17 @@ A API está localizada no diretório `backend/src/`, e é composta por três end #### **2. Consultar Licitações Anuais: `/tenders/year`** - **Descrição:** Retorna os valores totais empenhados, liquidados e pagos no ano informado no parâmetro "year". -- **URL:** `http://localhost:5000/tenders/year?year=2024` +- **URL:** `https://minas-cultura-api.onrender.com/tenders/year?year=2024` - **Método:** `GET` - **Parâmetros:** - `year`: Representa o ano de consulta no formato `AAAA` (ano). Por exemplo, `year=2024` retornará o total de licitações empenhadas, liquidadas e pagas no ano de 2024. +#### **3. Consultar a saúde da aplicação: `/health`** + +- **Descrição:** Retorna a mensagem "OK" em caso de sucesso na conexão com a api, este endpoint é necessário para monitorar a estabilidade do sistema. +- **URL:** `https://minas-cultura-api.onrender.com/health` +- **Método:** `GET` -### **Considerações Importantes** -- **Porta:** A API está configurada para rodar na porta `5000`. ---- Siga este guia para consultar e explorar as licitações culturais de Minas Gerais. Caso tenha dúvidas ou precise de suporte adicional, entre em contato com o time de desenvolvimento. \ No newline at end of file From 0fafe9d3f45e7b6a84a25f101445b1e0348a67f1 Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:47:51 -0300 Subject: [PATCH 15/16] docs: Adicionando detalhes ao 'Getting Started' --- docs/index.md | 11 ++++++++--- "docs/vis\303\243o geral/testes.md" | 1 - 2 files changed, 8 insertions(+), 4 deletions(-) delete mode 100644 "docs/vis\303\243o geral/testes.md" diff --git a/docs/index.md b/docs/index.md index 735598c..c0cfd27 100644 --- a/docs/index.md +++ b/docs/index.md @@ -63,9 +63,11 @@ Através desta aplicação, buscamos oferecer uma maneira mais transparente e ac ## 🚀 Getting Started -### Pré-requisito - -- Baixar o docker compose usando o apt [Aqui](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository) +### Pré-requisito para rodar localmente +- [Docker](https://www.docker.com/) +- [Docker Compose](https://docs.docker.com/compose/) +- [Npm](https://www.npmjs.com/) +- [Node](https://nodejs.org/en) ### Clonar o repositório @@ -80,6 +82,9 @@ cd 2024-1-MinasDeCultura ``` +Acesse o guia completo [Aqui](https://unb-mds.github.io/2024-1-MinasDeCultura/Como%20executar/Front-end/Executar%20o%20Frontend/) + + ## 🤖 Identidade Visual - *Desenvolvimento da Identidade Visual:* Investimos tempo no desenvolvimento de uma identidade visual consistente para o projeto, incluindo seleção de cores, tipografia e uma logo autêntica baseada na bandeira. Essa identidade visual reflete nossa visão e valores, e está integrada em toda a interface do usuário e materiais de design. diff --git "a/docs/vis\303\243o geral/testes.md" "b/docs/vis\303\243o geral/testes.md" deleted file mode 100644 index e2440dd..0000000 --- "a/docs/vis\303\243o geral/testes.md" +++ /dev/null @@ -1 +0,0 @@ -# Testes frontend \ No newline at end of file From e384589a725cdc8ddddaa67691e613de796ff9cf Mon Sep 17 00:00:00 2001 From: isaacbatista26 Date: Tue, 3 Sep 2024 13:57:43 -0300 Subject: [PATCH 16/16] fix: Corrigindo warnings do lint --- backend/[deprecated]/scripts/insertData.js | 4 ++-- backend/[deprecated]/scripts/insertInitialData.js | 4 ++-- backend/src/routes/healthRoutes.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/[deprecated]/scripts/insertData.js b/backend/[deprecated]/scripts/insertData.js index c032bf6..cabb6bd 100644 --- a/backend/[deprecated]/scripts/insertData.js +++ b/backend/[deprecated]/scripts/insertData.js @@ -35,7 +35,7 @@ async function main() { .single() if (unidadeAdmError || !unidadeAdmData) { - const { data, error } = await supabase + const { data } = await supabase .from('administrative_units') .insert([{ name: unidadeAdm }]) .single() @@ -52,7 +52,7 @@ async function main() { .single() if (cidadeError || !cidadeData) { - const { data, error } = await supabase + const { data } = await supabase .from('cities') .insert([{ name: cidade }]) .single() diff --git a/backend/[deprecated]/scripts/insertInitialData.js b/backend/[deprecated]/scripts/insertInitialData.js index 088679e..4e3cbf4 100644 --- a/backend/[deprecated]/scripts/insertInitialData.js +++ b/backend/[deprecated]/scripts/insertInitialData.js @@ -26,7 +26,7 @@ const insertInitialData = async () => { // Inserir cidades for (const city of uniqueCities) { - const { data: cityData, error: cityError } = await supabase + const { error: cityError } = await supabase .from('cities') .upsert({ name: city }, { onConflict: ['name'] }) @@ -37,7 +37,7 @@ const insertInitialData = async () => { // Inserir unidades administrativas for (const unit of uniqueUnits) { - const { data: unitData, error: unitError } = await supabase + const { error: unitError } = await supabase .from('administrative_units') .upsert({ name: unit }, { onConflict: ['name'] }) diff --git a/backend/src/routes/healthRoutes.js b/backend/src/routes/healthRoutes.js index b64a066..e8e9f73 100644 --- a/backend/src/routes/healthRoutes.js +++ b/backend/src/routes/healthRoutes.js @@ -1,7 +1,7 @@ const express = require('express'); const router = express.Router(); -router.get('/', async (_req, res, _next) => { +router.get('/', async (_req, res) => { const healthcheck = { message: 'OK' };