pdrMottaS commited on
Commit
ff31df8
·
1 Parent(s): 43059ab

add categoria and queries

Browse files
Dockerfile CHANGED
@@ -1,11 +1,6 @@
1
  FROM python:3.9
2
-
3
  WORKDIR /code
4
-
5
  COPY ./requirements.txt /code/requirements.txt
6
-
7
  RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
8
-
9
  COPY . .
10
-
11
  CMD ["python3","main.py"]
 
1
  FROM python:3.9
 
2
  WORKDIR /code
 
3
  COPY ./requirements.txt /code/requirements.txt
 
4
  RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
 
5
  COPY . .
 
6
  CMD ["python3","main.py"]
README.md CHANGED
@@ -1,10 +1,26 @@
1
- ---
2
- title: Ts02 Afabd
3
- emoji: 🐠
4
- colorFrom: blue
5
- colorTo: purple
6
- sdk: docker
7
- pinned: false
8
- ---
9
-
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Arquitetura de microsserviços
2
+
3
+ Diferentemente das arquiteturas monolíticas, a arquitetura orientada a microsserviços descreve que cada funcionalidade deve ser desenvolvida de forma independente, permitindo que o tie de desenvolvimento possa atualizar ou modificar alguma feature sem que outra seja afetada.
4
+
5
+ ## Projeto AFA-BD
6
+
7
+ ### Arquitetura atual
8
+
9
+ ![image](https://github.com/AfaBD/AFA-BD-2024/assets/58821700/dabe816f-8764-4004-9ecc-59e817a1f9ab)
10
+
11
+ Pontos para melhoria:
12
+
13
+ - Escalar horizontalmente a aplicação custaria muito recurso, já que seria necessário escalar todas as funcionalidades
14
+ - Manutenção custosa, ja que todas as funcionalidades estão acopladas
15
+
16
+ ### Arquitetura em microsserviços
17
+
18
+ ![WhatsApp Image 2024-04-05 at 9 56 06 PM](https://github.com/AfaBD/AFA-BD-2024/assets/58821700/ec099deb-cb91-4b4c-9b78-be1b829f58f2)
19
+
20
+ Serviços para a nova arquitetura:
21
+
22
+ - Frontend: camada de interação direta com o usuário
23
+ - Backend: camada para operações na camada de persistência (BD)
24
+ - IA-Model: Camada para operações com modelos de ML/IA
25
+
26
+ Todos os serviços estarão sendo orquestrados com kubernetes
controller/__init__.py CHANGED
@@ -6,6 +6,7 @@ from .cidade_controller import router as cidade_router
6
  from .tipo_escola_controller import router as tipo_escola_router
7
  from .unidade_escolar_controller import router as unidade_escolar_router
8
  from .endereco_controller import router as endereco_router
 
9
 
10
  __all__ = [
11
  'session_router',
@@ -15,5 +16,6 @@ __all__ = [
15
  'cidade_router',
16
  'tipo_escola_router',
17
  'unidade_escolar_router',
18
- 'endereco_router'
 
19
  ]
 
6
  from .tipo_escola_controller import router as tipo_escola_router
7
  from .unidade_escolar_controller import router as unidade_escolar_router
8
  from .endereco_controller import router as endereco_router
9
+ from .query_controller import router as query_router
10
 
11
  __all__ = [
12
  'session_router',
 
16
  'cidade_router',
17
  'tipo_escola_router',
18
  'unidade_escolar_router',
19
+ 'endereco_router',
20
+ 'query_router'
21
  ]
controller/query_controller.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import APIRouter, Depends
2
+ from model import Login
3
+ from schema import Query201,Query202
4
+ from service import QueryService,SessionService
5
+ from typing import Annotated,List
6
+
7
+ router = APIRouter(
8
+ prefix='/query'
9
+ )
10
+
11
+ service = SessionService()
12
+
13
+ @router.get('/201',response_model=List[Query201])
14
+ def runquery201(user: Annotated[Login,Depends(service.validate_token)]):
15
+ query_service = QueryService()
16
+ return query_service.query201()
17
+
18
+ @router.get('/202',response_model=List[Query202])
19
+ def runquery202(user: Annotated[Login,Depends(service.validate_token)]):
20
+ query_service = QueryService()
21
+ return query_service.query202()
database.db CHANGED
Binary files a/database.db and b/database.db differ
 
main.py CHANGED
@@ -2,7 +2,7 @@ from fastapi import FastAPI
2
  import uvicorn
3
  from fastapi.middleware.cors import CORSMiddleware
4
 
5
- from controller import session_router,user_router,role_router,regiao_router,cidade_router,tipo_escola_router,unidade_escolar_router,endereco_router
6
 
7
  app = FastAPI()
8
 
@@ -24,5 +24,6 @@ app.include_router(cidade_router)
24
  app.include_router(tipo_escola_router)
25
  app.include_router(unidade_escolar_router)
26
  app.include_router(endereco_router)
 
27
 
28
  uvicorn.run(app,host='0.0.0.0',port=7860)
 
2
  import uvicorn
3
  from fastapi.middleware.cors import CORSMiddleware
4
 
5
+ from controller import query_router,session_router,user_router,role_router,regiao_router,cidade_router,tipo_escola_router,unidade_escolar_router,endereco_router
6
 
7
  app = FastAPI()
8
 
 
24
  app.include_router(tipo_escola_router)
25
  app.include_router(unidade_escolar_router)
26
  app.include_router(endereco_router)
27
+ app.include_router(query_router)
28
 
29
  uvicorn.run(app,host='0.0.0.0',port=7860)
model/__init__.py CHANGED
@@ -5,6 +5,7 @@ from .tipo_escola import TipoEscola
5
  from .endereco import Endereco
6
  from .cidade import Cidade
7
  from .regiao import Regiao
 
8
 
9
  __all__ = [
10
  "Login",
@@ -13,5 +14,6 @@ __all__ = [
13
  "TipoEscola",
14
  "Endereco",
15
  "Cidade",
16
- "Regiao"
 
17
  ]
 
5
  from .endereco import Endereco
6
  from .cidade import Cidade
7
  from .regiao import Regiao
8
+ from .categoria import Categoria
9
 
10
  __all__ = [
11
  "Login",
 
14
  "TipoEscola",
15
  "Endereco",
16
  "Cidade",
17
+ "Regiao",
18
+ "Categoria"
19
  ]
model/categoria.py ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ from database import Base
2
+ from sqlalchemy import Column, Integer,String, ForeignKey
3
+ from sqlalchemy.orm import Mapped,relationship
4
+
5
+ class Categoria(Base):
6
+ __tablename__ = "categoria_escolar"
7
+
8
+ id = Column("cat_id",Integer, primary_key=True,index=True)
9
+ description = Column("cat_descricao",String(255),nullable=False)
10
+ unidades = relationship("UnidadeEscolar", back_populates="categoria",lazy="selectin")
model/unidade_escolar.py CHANGED
@@ -12,6 +12,9 @@ class UnidadeEscolar(Base):
12
  id_tipo = Column("tip_id", Integer, ForeignKey("tipo_escola.tip_id"))
13
  tipo = relationship("TipoEscola", back_populates="unidades", lazy="selectin")
14
 
 
 
 
15
  id_endereco = Column("end_id", Integer, ForeignKey("endereco.end_id"))
16
  endereco = relationship("Endereco", back_populates="unidades", lazy="selectin")
17
 
 
12
  id_tipo = Column("tip_id", Integer, ForeignKey("tipo_escola.tip_id"))
13
  tipo = relationship("TipoEscola", back_populates="unidades", lazy="selectin")
14
 
15
+ id_categoria = Column("cat_id", Integer, ForeignKey("categoria_escolar.cat_id"))
16
+ categoria = relationship("Categoria", back_populates="unidades", lazy="selectin")
17
+
18
  id_endereco = Column("end_id", Integer, ForeignKey("endereco.end_id"))
19
  endereco = relationship("Endereco", back_populates="unidades", lazy="selectin")
20
 
schema/__init__.py CHANGED
@@ -6,6 +6,8 @@ from .cidade import CidadeBase,ResponseCidade,RequestCidade
6
  from .tipo_escola import BaseTipoEscola,ResponseTipoEscola
7
  from .endereco import ResponseEndereco,RequestEndereco
8
  from .unidade_escolar import ResponseUnidadeEscolar,RequestUnidadeEscolar
 
 
9
 
10
  __all__ = [
11
  "RequestSession",
@@ -25,5 +27,8 @@ __all__ = [
25
  "ResponseEndereco",
26
  "ResponseUnidadeEscolar",
27
  "RequestEndereco",
28
- "RequestUnidadeEscolar"
 
 
 
29
  ]
 
6
  from .tipo_escola import BaseTipoEscola,ResponseTipoEscola
7
  from .endereco import ResponseEndereco,RequestEndereco
8
  from .unidade_escolar import ResponseUnidadeEscolar,RequestUnidadeEscolar
9
+ from .categoria import ResponseCategoriaEscola
10
+ from .query import Query201,Query202
11
 
12
  __all__ = [
13
  "RequestSession",
 
27
  "ResponseEndereco",
28
  "ResponseUnidadeEscolar",
29
  "RequestEndereco",
30
+ "RequestUnidadeEscolar",
31
+ "ResponseCategoriaEscola",
32
+ "Query201",
33
+ "Query202"
34
  ]
schema/categoria.py ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ from pydantic import BaseModel
2
+
3
+ class BaseCategoriaEscola(BaseModel):
4
+ descricao: str
5
+
6
+ class ResponseCategoriaEscola(BaseCategoriaEscola):
7
+ id: int
schema/query.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydantic import BaseModel
2
+ from typing import List
3
+ from .unidade_escolar import ResponseUnidadeEscolar
4
+
5
+ class Query201(BaseModel):
6
+ regiao:str
7
+ count:int
8
+ unidades_escolares: List[ResponseUnidadeEscolar]
9
+
10
+ class Query202(BaseModel):
11
+ regiao:str
12
+ categoria:str
13
+ tipo:str
14
+ num_escolas:int
schema/unidade_escolar.py CHANGED
@@ -1,6 +1,7 @@
1
  from pydantic import BaseModel
2
  from .tipo_escola import ResponseTipoEscola
3
  from .endereco import ResponseEndereco,RequestEndereco
 
4
 
5
  class UnidadeEscolarBase(BaseModel):
6
  nome: str
@@ -9,8 +10,10 @@ class UnidadeEscolarBase(BaseModel):
9
  class ResponseUnidadeEscolar(UnidadeEscolarBase):
10
  id:int
11
  tipo: ResponseTipoEscola
 
12
  endereco: ResponseEndereco
13
 
14
  class RequestUnidadeEscolar(UnidadeEscolarBase):
15
  tipo_id: int
 
16
  endereco: RequestEndereco
 
1
  from pydantic import BaseModel
2
  from .tipo_escola import ResponseTipoEscola
3
  from .endereco import ResponseEndereco,RequestEndereco
4
+ from .categoria import ResponseCategoriaEscola
5
 
6
  class UnidadeEscolarBase(BaseModel):
7
  nome: str
 
10
  class ResponseUnidadeEscolar(UnidadeEscolarBase):
11
  id:int
12
  tipo: ResponseTipoEscola
13
+ categoria:ResponseCategoriaEscola
14
  endereco: ResponseEndereco
15
 
16
  class RequestUnidadeEscolar(UnidadeEscolarBase):
17
  tipo_id: int
18
+ categoria_id: int
19
  endereco: RequestEndereco
service/__init__.py CHANGED
@@ -6,6 +6,7 @@ from .cidade_service import CidadeService
6
  from .tipo_escola_service import TipoEscolaService
7
  from .unidade_escolar_service import UnidadeEscolarService
8
  from .endereco_service import EnderecoService
 
9
 
10
  __all__ = [
11
  'SessionService',
@@ -15,5 +16,6 @@ __all__ = [
15
  'CidadeService',
16
  'TipoEscolaService',
17
  'UnidadeEscolarService',
18
- 'EnderecoService'
 
19
  ]
 
6
  from .tipo_escola_service import TipoEscolaService
7
  from .unidade_escolar_service import UnidadeEscolarService
8
  from .endereco_service import EnderecoService
9
+ from .query_service import QueryService
10
 
11
  __all__ = [
12
  'SessionService',
 
16
  'CidadeService',
17
  'TipoEscolaService',
18
  'UnidadeEscolarService',
19
+ 'EnderecoService',
20
+ 'QueryService'
21
  ]
service/query_service.py ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from database import SessionLocal
2
+ from sqlalchemy import func
3
+ from sqlalchemy.orm import joinedload
4
+ from model import UnidadeEscolar,Endereco,Cidade,Regiao,Categoria,TipoEscola
5
+ from schema import ResponseUnidadeEscolar,ResponseTipoEscola,ResponseEndereco,ResponseCategoriaEscola,Query201,Query202
6
+
7
+ class QueryService:
8
+
9
+ def query201(self):
10
+ with SessionLocal() as db:
11
+ query_result = db.query(
12
+ Regiao.descricao,
13
+ UnidadeEscolar
14
+ ).join(Cidade, Regiao.id == Cidade.id_regiao
15
+ ).join(Endereco, Cidade.id == Endereco.id_cidade
16
+ ).join(UnidadeEscolar, Endereco.id == UnidadeEscolar.id_endereco
17
+ ).options(
18
+ joinedload(UnidadeEscolar.tipo),
19
+ joinedload(UnidadeEscolar.endereco).joinedload(Endereco.cidade).joinedload(Cidade.regiao)
20
+ ).group_by(Regiao.descricao, UnidadeEscolar.id).all()
21
+ result_dict = {}
22
+ for regiao,unidade in query_result:
23
+ if regiao not in result_dict:
24
+ result_dict[regiao] = {'count': 0, 'unidades_escolares': []}
25
+ result_dict[regiao]['count'] += 1
26
+ result_dict[regiao]['unidades_escolares'].append(
27
+ ResponseUnidadeEscolar(
28
+ nome=unidade.nome,
29
+ cod_inep=unidade.cod_inep,
30
+ id=unidade.id,
31
+ tipo=ResponseTipoEscola(
32
+ id=unidade.tipo.id,
33
+ descricao=unidade.tipo.description
34
+ ),
35
+ categoria=ResponseCategoriaEscola(
36
+ id = unidade.categoria.id,
37
+ descricao=unidade.categoria.description
38
+ ),
39
+ endereco=ResponseEndereco(
40
+ id=unidade.endereco.id,
41
+ rua=unidade.endereco.rua,
42
+ numero=unidade.endereco.numero,
43
+ cep=unidade.endereco.cep,
44
+ cidade=unidade.endereco.cidade.nome,
45
+ regiao=unidade.endereco.cidade.regiao.descricao
46
+ )
47
+ )
48
+ )
49
+ return [
50
+ Query201(regiao=regiao, count=data['count'], unidades_escolares=data['unidades_escolares'])
51
+ for regiao, data in result_dict.items()
52
+ ]
53
+
54
+ def query202(self):
55
+ with SessionLocal() as db:
56
+ query_result = db.query(
57
+ Regiao.descricao.label("regiao_nome"),
58
+ Categoria.description.label("categoria"),
59
+ TipoEscola.description.label("tipo_escola"),
60
+ func.count(UnidadeEscolar.id).label("num_unidades")
61
+ ).join(
62
+ Cidade
63
+ ).join(
64
+ Endereco
65
+ ).join(
66
+ UnidadeEscolar
67
+ ).join(
68
+ Categoria
69
+ ).join(
70
+ TipoEscola
71
+ ).group_by(
72
+ Regiao.descricao,
73
+ Categoria.description,
74
+ TipoEscola.description
75
+ ).all()
76
+ return [
77
+ Query202(regiao=result.regiao_nome,categoria=result.categoria,tipo=result.tipo_escola,num_escolas=result.num_unidades)
78
+ for result in query_result
79
+ ]
80
+
service/unidade_escolar_service.py CHANGED
@@ -1,7 +1,7 @@
1
  from database import SessionLocal
2
  from model import UnidadeEscolar,Endereco,Cidade
3
  from exception import unidade_escolar_not_found
4
- from schema import ResponseUnidadeEscolar, ResponseTipoEscola, ResponseEndereco, RequestUnidadeEscolar
5
  from sqlalchemy.orm import joinedload
6
  from .endereco_service import EnderecoService
7
 
@@ -18,6 +18,10 @@ class UnidadeEscolarService:
18
  id=unidade_escolar.tipo.id,
19
  descricao=unidade_escolar.tipo.description
20
  )
 
 
 
 
21
  endereco = ResponseEndereco(
22
  rua=unidade_escolar.endereco.rua,
23
  numero=unidade_escolar.endereco.numero,
@@ -31,6 +35,7 @@ class UnidadeEscolarService:
31
  nome= unidade_escolar.nome,
32
  cod_inep=unidade_escolar.cod_inep,
33
  tipo=tipo_escola,
 
34
  endereco=endereco
35
  )
36
 
@@ -38,6 +43,7 @@ class UnidadeEscolarService:
38
  unidade_escolar = UnidadeEscolar()
39
  unidade_escolar.nome = unidade_escolar_request.nome
40
  unidade_escolar.cod_inep = unidade_escolar_request.cod_inep
 
41
  unidade_escolar.id_tipo = unidade_escolar_request.tipo_id
42
  endereco_service = EnderecoService()
43
  endereco = endereco_service.create_endereco(unidade_escolar_request.endereco)
 
1
  from database import SessionLocal
2
  from model import UnidadeEscolar,Endereco,Cidade
3
  from exception import unidade_escolar_not_found
4
+ from schema import ResponseUnidadeEscolar, ResponseTipoEscola, ResponseEndereco, RequestUnidadeEscolar, ResponseCategoriaEscola
5
  from sqlalchemy.orm import joinedload
6
  from .endereco_service import EnderecoService
7
 
 
18
  id=unidade_escolar.tipo.id,
19
  descricao=unidade_escolar.tipo.description
20
  )
21
+ categoria = ResponseCategoriaEscola(
22
+ id=unidade_escolar.categoria.id,
23
+ descricao=unidade_escolar.categoria.description
24
+ )
25
  endereco = ResponseEndereco(
26
  rua=unidade_escolar.endereco.rua,
27
  numero=unidade_escolar.endereco.numero,
 
35
  nome= unidade_escolar.nome,
36
  cod_inep=unidade_escolar.cod_inep,
37
  tipo=tipo_escola,
38
+ categoria=categoria,
39
  endereco=endereco
40
  )
41
 
 
43
  unidade_escolar = UnidadeEscolar()
44
  unidade_escolar.nome = unidade_escolar_request.nome
45
  unidade_escolar.cod_inep = unidade_escolar_request.cod_inep
46
+ unidade_escolar.id_categoria = unidade_escolar_request.categoria_id
47
  unidade_escolar.id_tipo = unidade_escolar_request.tipo_id
48
  endereco_service = EnderecoService()
49
  endereco = endereco_service.create_endereco(unidade_escolar_request.endereco)