From 229ffd8459608df71acaffd2d0478e4b487962b5 Mon Sep 17 00:00:00 2001 From: Holdwich Date: Wed, 22 Jan 2025 17:24:17 -0300 Subject: [PATCH 01/15] =?UTF-8?q?[ADD]=20Commit=20inicial=20do=20projeto,?= =?UTF-8?q?=20constru=C3=A7=C3=A3o=20do=20modelo=20do=20projeto,=20model?= =?UTF-8?q?=20e=20DB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + controllers/filmeController.py | 0 main.py | 3 +++ models/filmeModel.py | 8 +++++++ models/interfaces/filmeRepoInterface.py | 0 models/repos/filmeRepoMySQL.py | 0 utils/db/mySqlDb.py | 31 +++++++++++++++++++++++++ 7 files changed, 43 insertions(+) create mode 100644 .gitignore create mode 100644 controllers/filmeController.py create mode 100644 main.py create mode 100644 models/filmeModel.py create mode 100644 models/interfaces/filmeRepoInterface.py create mode 100644 models/repos/filmeRepoMySQL.py create mode 100644 utils/db/mySqlDb.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..2eea525d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/controllers/filmeController.py b/controllers/filmeController.py new file mode 100644 index 00000000..e69de29b diff --git a/main.py b/main.py new file mode 100644 index 00000000..ba3e2475 --- /dev/null +++ b/main.py @@ -0,0 +1,3 @@ +from fastapi import FastAPI + +app = FastAPI() \ No newline at end of file diff --git a/models/filmeModel.py b/models/filmeModel.py new file mode 100644 index 00000000..467a4900 --- /dev/null +++ b/models/filmeModel.py @@ -0,0 +1,8 @@ +from pydantic import BaseModel + +class FilmeModel(BaseModel): + id: int + titulo: str + diretor: str + ano_lancamento: int + genero: str \ No newline at end of file diff --git a/models/interfaces/filmeRepoInterface.py b/models/interfaces/filmeRepoInterface.py new file mode 100644 index 00000000..e69de29b diff --git a/models/repos/filmeRepoMySQL.py b/models/repos/filmeRepoMySQL.py new file mode 100644 index 00000000..e69de29b diff --git a/utils/db/mySqlDb.py b/utils/db/mySqlDb.py new file mode 100644 index 00000000..b6115069 --- /dev/null +++ b/utils/db/mySqlDb.py @@ -0,0 +1,31 @@ +import mysql.connector +from mysql.connector import Error +import os + +def criar_conexao(): + """ + Cria uma conex o com o banco de dados mySql. + + Esta fun o cria uma conex o com o banco de dados mySql + utilizando a biblioteca mysql-connector-python. Ela + verifica se a conex o foi estabelecida com sucesso e + retorna a conex o criada. + + Returns: + connection: Uma conex o com o banco de dados mySql + Raises: + Error: Se houver um erro ao conectar com o banco de dados + """ + try: + connection = mysql.connector.connect( + host='localhost', + user=os.getenv('MYSQL_USER'), + password=os.getenv('MYSQL_PASSWORD'), + database='filmes_db' + ) + if connection.is_connected(): + print("Conexão com o banco de dados mySql estabelecida com sucesso!") + return connection + except Error as e: + print(f"Erro ao conectar com o banco de dados: {e}") + raise e \ No newline at end of file From 8a420b5b32277b8f409a6e9149e266f88a06fb2a Mon Sep 17 00:00:00 2001 From: Holdwich Date: Wed, 22 Jan 2025 17:30:39 -0300 Subject: [PATCH 02/15] =?UTF-8?q?[REFACTOR]=20mudan=C3=A7a=20do=20nome=20d?= =?UTF-8?q?a=20fun=C3=A7=C3=A3o=20para=20conex=C3=A3o=20mySql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/db/mySqlDb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/db/mySqlDb.py b/utils/db/mySqlDb.py index b6115069..a9ca1e3e 100644 --- a/utils/db/mySqlDb.py +++ b/utils/db/mySqlDb.py @@ -2,7 +2,7 @@ from mysql.connector import Error import os -def criar_conexao(): +def criar_conexao_mySql(): """ Cria uma conex o com o banco de dados mySql. From 2bbc665c9f7f45bc2bd5cd6a8b41e7da57522421 Mon Sep 17 00:00:00 2001 From: Holdwich Date: Wed, 22 Jan 2025 17:42:02 -0300 Subject: [PATCH 03/15] [ADD] Adicionando interface, repo em mySql --- models/interfaces/filmeRepoInterface.py | 21 +++++++++ models/repos/filmeRepoMySQL.py | 58 +++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/models/interfaces/filmeRepoInterface.py b/models/interfaces/filmeRepoInterface.py index e69de29b..ea7f4f87 100644 --- a/models/interfaces/filmeRepoInterface.py +++ b/models/interfaces/filmeRepoInterface.py @@ -0,0 +1,21 @@ +from typing import List +from filmeModel import FilmeModel + +class FilmeRepoInterface: + def get_filmes(self) -> List[FilmeModel]: + """ + Retorna todos os filmes + """ + pass + + def post_filme(self, filme: FilmeModel) -> FilmeModel: + """ + Cria um novo filme + """ + pass + + def get_filme_by_id(self, id: int) -> FilmeModel: + """ + Retorna um filme pelo seu id + """ + pass diff --git a/models/repos/filmeRepoMySQL.py b/models/repos/filmeRepoMySQL.py index e69de29b..634a2ba5 100644 --- a/models/repos/filmeRepoMySQL.py +++ b/models/repos/filmeRepoMySQL.py @@ -0,0 +1,58 @@ +from typing import List +from models.interfaces.filmeRepoInterface import FilmeRepoInterface +from models.filmeModel import FilmeModel + +class FilmeRepoMySQL(FilmeRepoInterface): + def __init__(self, conexao_mysql): + """ + Construtor da classe FilmeRepoMySQL + + Args: + conexao_mysql (conexao mysql): Conexao com o banco de dados mysql + """ + self.conexao = conexao_mysql + + def get_filmes(self) -> List[FilmeModel]: + """ + Retorna todos os filmes + """ + cursor = self.conexao.cursor() + cursor.execute("SELECT * FROM filmes") + rows = cursor.fetchall() + filmes = [] + for row in rows: + filmes.append(FilmeModel( + id=row[0], + titulo=row[1], + diretor=row[2], + ano_lancamento=row[3], + genero=row[4] + )) + return filmes + + def post_filme(self, filme: FilmeModel) -> FilmeModel: + """ + Cria um novo filme + """ + cursor = self.conexao.cursor() + cursor.execute("INSERT INTO filmes (titulo, diretor, ano_lancamento, genero) VALUES (%s, %s, %s, %s)", + (filme.titulo, filme.diretor, filme.ano_lancamento, filme.genero)) + self.conexao.commit() + return filme + + def get_filme_by_id(self, id: int) -> FilmeModel: + """ + Retorna um filme pelo seu id + """ + cursor = self.conexao.cursor() + cursor.execute("SELECT * FROM filmes WHERE id = %s", (id,)) + row = cursor.fetchone() + if row is None: + return None + return FilmeModel( + id=row[0], + titulo=row[1], + diretor=row[2], + ano_lancamento=row[3], + genero=row[4] + ) From e46cf129fa7bd5b212099e4fb973f5d6a1758bbe Mon Sep 17 00:00:00 2001 From: Holdwich Date: Wed, 22 Jan 2025 18:49:46 -0300 Subject: [PATCH 04/15] [REFACTOR] Mudando .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2eea525d..dc12cb74 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.env \ No newline at end of file +.env +__pycache__ \ No newline at end of file From 0819afc84456eaee13ffb708e026b050009c3fb1 Mon Sep 17 00:00:00 2001 From: Holdwich Date: Wed, 22 Jan 2025 18:51:16 -0300 Subject: [PATCH 05/15] =?UTF-8?q?[ADD/REFACTOR]=20Adicionando=20camada=20d?= =?UTF-8?q?e=20DB,=20servi=C3=A7os,=20modelos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/filmeModel.py | 12 ++++++----- models/interfaces/filmeRepoInterface.py | 2 +- models/repos/filmeRepoMySQL.py | 10 ++++----- services/mySqlDbService.py | 28 +++++++++++++++++++++++++ utils/db/mySqlDb.py | 14 +++++++++---- 5 files changed, 51 insertions(+), 15 deletions(-) create mode 100644 services/mySqlDbService.py diff --git a/models/filmeModel.py b/models/filmeModel.py index 467a4900..f7795a43 100644 --- a/models/filmeModel.py +++ b/models/filmeModel.py @@ -1,8 +1,10 @@ -from pydantic import BaseModel +from pydantic import BaseModel, Field class FilmeModel(BaseModel): - id: int - titulo: str - diretor: str + titulo: str = Field(max_length=255) + diretor: str = Field(max_length=255) ano_lancamento: int - genero: str \ No newline at end of file + genero: str = Field(max_length=255) + +class FilmeResponse(FilmeModel): + id: int \ No newline at end of file diff --git a/models/interfaces/filmeRepoInterface.py b/models/interfaces/filmeRepoInterface.py index ea7f4f87..8fb5f954 100644 --- a/models/interfaces/filmeRepoInterface.py +++ b/models/interfaces/filmeRepoInterface.py @@ -1,5 +1,5 @@ from typing import List -from filmeModel import FilmeModel +from models.filmeModel import FilmeModel class FilmeRepoInterface: def get_filmes(self) -> List[FilmeModel]: diff --git a/models/repos/filmeRepoMySQL.py b/models/repos/filmeRepoMySQL.py index 634a2ba5..02fa620a 100644 --- a/models/repos/filmeRepoMySQL.py +++ b/models/repos/filmeRepoMySQL.py @@ -1,6 +1,6 @@ from typing import List from models.interfaces.filmeRepoInterface import FilmeRepoInterface -from models.filmeModel import FilmeModel +from models.filmeModel import FilmeModel, FilmeResponse class FilmeRepoMySQL(FilmeRepoInterface): def __init__(self, conexao_mysql): @@ -12,7 +12,7 @@ def __init__(self, conexao_mysql): """ self.conexao = conexao_mysql - def get_filmes(self) -> List[FilmeModel]: + def get_filmes(self) -> List[FilmeResponse]: """ Retorna todos os filmes """ @@ -21,7 +21,7 @@ def get_filmes(self) -> List[FilmeModel]: rows = cursor.fetchall() filmes = [] for row in rows: - filmes.append(FilmeModel( + filmes.append(FilmeResponse( id=row[0], titulo=row[1], diretor=row[2], @@ -40,7 +40,7 @@ def post_filme(self, filme: FilmeModel) -> FilmeModel: self.conexao.commit() return filme - def get_filme_by_id(self, id: int) -> FilmeModel: + def get_filme_by_id(self, id: int) -> FilmeResponse: """ Retorna um filme pelo seu id """ @@ -49,7 +49,7 @@ def get_filme_by_id(self, id: int) -> FilmeModel: row = cursor.fetchone() if row is None: return None - return FilmeModel( + return FilmeResponse( id=row[0], titulo=row[1], diretor=row[2], diff --git a/services/mySqlDbService.py b/services/mySqlDbService.py new file mode 100644 index 00000000..499fdc3f --- /dev/null +++ b/services/mySqlDbService.py @@ -0,0 +1,28 @@ +class mySqlDbService: + def __init__(self, connection): + """ + Construtor da classe mySqlDbService. + + Args: + connection (conexao mysql): Conexao com o banco de dados mysql + """ + self.connection = connection + + def criar_banco(self, nome_banco): + + """ + Cria um banco de dados no MySQL se ele não existir. + + Esta função utiliza a conexão MySQL fornecida para criar um banco de dados + com o nome especificado. Se o banco de dados já existir, ele não será recriado. + + Args: + nome_banco (str): O nome do banco de dados a ser criado. + """ + + cursor = self.connection.cursor() + cursor.execute(f"CREATE DATABASE IF NOT EXISTS {nome_banco}") + cursor.execute(f"USE {nome_banco}") + cursor.execute("CREATE TABLE IF NOT EXISTS filmes (id INT AUTO_INCREMENT PRIMARY KEY, titulo VARCHAR(255), diretor VARCHAR(255), ano_lancamento INT, genero VARCHAR(255))") + self.connection.commit() + print(f"Banco de dados '{nome_banco}' criado ou já existente.") \ No newline at end of file diff --git a/utils/db/mySqlDb.py b/utils/db/mySqlDb.py index a9ca1e3e..d7829c11 100644 --- a/utils/db/mySqlDb.py +++ b/utils/db/mySqlDb.py @@ -1,6 +1,6 @@ import mysql.connector -from mysql.connector import Error import os +from services.mySqlDbService import mySqlDbService def criar_conexao_mySql(): """ @@ -19,13 +19,19 @@ def criar_conexao_mySql(): try: connection = mysql.connector.connect( host='localhost', + port=3306, user=os.getenv('MYSQL_USER'), - password=os.getenv('MYSQL_PASSWORD'), - database='filmes_db' + password=os.getenv('MYSQL_PASSWORD') ) if connection.is_connected(): print("Conexão com o banco de dados mySql estabelecida com sucesso!") + + dbService = mySqlDbService(connection) + + dbService.criar_banco(os.getenv('MYSQL_DATABASE')) + connection.database = os.getenv('MYSQL_DATABASE') + return connection - except Error as e: + except Exception as e: print(f"Erro ao conectar com o banco de dados: {e}") raise e \ No newline at end of file From 9731a9b48ba4ba7b2d1fde36b3e45903ec58e4a2 Mon Sep 17 00:00:00 2001 From: Holdwich Date: Wed, 22 Jan 2025 18:51:34 -0300 Subject: [PATCH 06/15] [ADD] Montando controller e main --- controllers/filmeController.py | 27 +++++++++++++++++++++++++++ main.py | 12 +++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/controllers/filmeController.py b/controllers/filmeController.py index e69de29b..b3c212a7 100644 --- a/controllers/filmeController.py +++ b/controllers/filmeController.py @@ -0,0 +1,27 @@ +from typing import List +from fastapi import APIRouter +from models.interfaces.filmeRepoInterface import FilmeRepoInterface +from models.filmeModel import FilmeModel, FilmeResponse + +class FilmeController(): + + def __init__(self, filmeRepo : FilmeRepoInterface): + + self.filmeRepo = filmeRepo + + self.router = APIRouter() + + self.router.add_api_route("/filmes", self.get_filmes, methods=["GET"], response_model = List[FilmeResponse]) + self.router.add_api_route("/filmes", self.post_filme, methods=["POST"]) + self.router.add_api_route("/filmes/{id}", self.get_filme_by_id, methods=["GET"], response_model = List[FilmeResponse]) + + def get_filmes(self): + return self.filmeRepo.get_filmes() + + def post_filme(self, filme: FilmeModel): + return self.filmeRepo.post_filme(filme) + + def get_filme_by_id(self, id: int): + return self.filmeRepo.get_filme_by_id(id) + + diff --git a/main.py b/main.py index ba3e2475..29eec71d 100644 --- a/main.py +++ b/main.py @@ -1,3 +1,13 @@ from fastapi import FastAPI +from utils.db import mySqlDb +from controllers.filmeController import FilmeController +from models.repos.filmeRepoMySQL import FilmeRepoMySQL + +app = FastAPI() + +connectionMySql = mySqlDb.criar_conexao_mySql() +repoMySql = FilmeRepoMySQL(connectionMySql) +item_controller = FilmeController(repoMySql) + +app.include_router(item_controller.router) -app = FastAPI() \ No newline at end of file From c688efe809e3974402935425a05a2067e03eadfe Mon Sep 17 00:00:00 2001 From: Holdwich Date: Thu, 23 Jan 2025 16:46:22 -0300 Subject: [PATCH 07/15] =?UTF-8?q?[ADD]=20Adicionando=20servi=C3=A7o=20resp?= =?UTF-8?q?ons=C3=A1vel=20por=20determinar=20a=20conex=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/connectionService.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 services/connectionService.py diff --git a/services/connectionService.py b/services/connectionService.py new file mode 100644 index 00000000..d2bbe63b --- /dev/null +++ b/services/connectionService.py @@ -0,0 +1,17 @@ +import os +from utils.db import mySqlDb +from models.repos.filmeRepoMySQL import FilmeRepoMySQL + + +def determinar_conexao(): + """ + Determina qual conexão a ser utilizada com base no valor da variável de ambiente DB_TYPE. + + Returns: + FilmeRepoInterface: Repositório de filmes + """ + if os.getenv('DB_TYPE') == 'mysql': + connectionMySql = mySqlDb.criar_conexao_mySql() + repo = FilmeRepoMySQL(connectionMySql) + + return repo \ No newline at end of file From 5a67bfe063f1c181fd68a0178b995cd24ebc6b2a Mon Sep 17 00:00:00 2001 From: Holdwich Date: Thu, 23 Jan 2025 16:46:43 -0300 Subject: [PATCH 08/15] =?UTF-8?q?[REFACTOR]=20Modificando=20o=20main=20par?= =?UTF-8?q?a=20utilizar=20o=20servi=C3=A7o=20de=20determina=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20conex=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/main.py b/main.py index 29eec71d..c75c3eb8 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,12 @@ from fastapi import FastAPI from utils.db import mySqlDb from controllers.filmeController import FilmeController -from models.repos.filmeRepoMySQL import FilmeRepoMySQL +from services.connectionService import determinar_conexao app = FastAPI() -connectionMySql = mySqlDb.criar_conexao_mySql() -repoMySql = FilmeRepoMySQL(connectionMySql) -item_controller = FilmeController(repoMySql) +repo = determinar_conexao() +item_controller = FilmeController(repo) app.include_router(item_controller.router) From 20586abced7cb8146b652cc709e8f7fea31f4b64 Mon Sep 17 00:00:00 2001 From: Holdwich Date: Thu, 23 Jan 2025 16:47:00 -0300 Subject: [PATCH 09/15] =?UTF-8?q?[ADD]=20Documenta=C3=A7=C3=A3o=20do=20fil?= =?UTF-8?q?meController?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/filmeController.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/controllers/filmeController.py b/controllers/filmeController.py index b3c212a7..625424e4 100644 --- a/controllers/filmeController.py +++ b/controllers/filmeController.py @@ -7,21 +7,51 @@ class FilmeController(): def __init__(self, filmeRepo : FilmeRepoInterface): + """ + Construtor da classe FilmeController. + + Args: + filmeRepo (FilmeRepoInterface): Interface de repositório de filmes. + + Attributes: + filmeRepo (FilmeRepoInterface): Interface de repositório de filmes. + router (FastAPI.Routers): Roteador de endpoints da API. + """ + self.filmeRepo = filmeRepo - self.router = APIRouter() + self.router = APIRouter(tags=["Filmes"]) self.router.add_api_route("/filmes", self.get_filmes, methods=["GET"], response_model = List[FilmeResponse]) self.router.add_api_route("/filmes", self.post_filme, methods=["POST"]) self.router.add_api_route("/filmes/{id}", self.get_filme_by_id, methods=["GET"], response_model = List[FilmeResponse]) def get_filmes(self): + """ + Retorna todos os filmes + + Returns: + List[FilmeResponse]: lista de filmes + """ return self.filmeRepo.get_filmes() def post_filme(self, filme: FilmeModel): + """ + Cria um novo filme + """ + return self.filmeRepo.post_filme(filme) def get_filme_by_id(self, id: int): + """ + Retorna um filme pelo seu id + + Args: + id (int): o id do filme a ser retornado + + Returns: + List[FilmeResponse]: o filme com o id especificado + """ return self.filmeRepo.get_filme_by_id(id) From fc07927d6bd8bd9de788861a5f5609ebb11a301d Mon Sep 17 00:00:00 2001 From: Holdwich Date: Thu, 23 Jan 2025 16:55:35 -0300 Subject: [PATCH 10/15] [ADD] requirements.txt --- requirements.txt | Bin 0 -> 638 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..ff9b5451447bd2c984a923acb34ff7f85bd5dca4 GIT binary patch literal 638 zcmZ9K?@q!%5XAShiH}mlwcwu*yn!YfAApcjpb<`_XyoP9-|V&xF_%rRx3jaebNBnR zw9I<9lP!tHR#xym+kt&&bJoOe?2ee&wOxVAWLqkfn{s|X=4#uKsqM{kI!~TgT}{P~ zIKr?e24*qbI`f*-&UGAM8S)8^*@)Rt->@=V4OpS7zE5(NE%-PJCW1LXOB5PQ6xun=i!`mRsLqe`9FZ~UJ(EQ literal 0 HcmV?d00001 From 0da32e7e9ecd5c191de7fc3f138710300ab556bd Mon Sep 17 00:00:00 2001 From: Holdwich Date: Thu, 23 Jan 2025 18:28:01 -0300 Subject: [PATCH 11/15] =?UTF-8?q?[ADD]=20implementa=C3=A7=C3=A3o=20do=20do?= =?UTF-8?q?cker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 13 +++++++++++++ docker-compose.yml | 22 ++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..f4b7728d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.12-slim + +WORKDIR /app + +COPY requirements.txt requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt + +COPY . . + +EXPOSE 8000 + +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..3812e7d6 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,22 @@ +version: '1.0' + +services: + fastapi: + build: . + ports: + - 8000:8000 + env_file: + - .env + volumes: + - .:/app + depends_on: + - mysql + entrypoint: sh -c "sleep 10 && uvicorn main:app --host 0.0.0.0 --port 8000" + + mysql: + container_name: mysqldb + image: mysql:8.0 + ports: + - 3307:3306 + environment: + MYSQL_ROOT_PASSWORD: root \ No newline at end of file From cd677f469afe9cd4a71617adcb4c68597c5fe624 Mon Sep 17 00:00:00 2001 From: Holdwich Date: Thu, 23 Jan 2025 18:28:22 -0300 Subject: [PATCH 12/15] =?UTF-8?q?[REFACTOR]=20utilizando=20docker=20para?= =?UTF-8?q?=20cria=C3=A7=C3=A3o=20do=20DB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/db/mySqlDb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/db/mySqlDb.py b/utils/db/mySqlDb.py index d7829c11..9279c7d2 100644 --- a/utils/db/mySqlDb.py +++ b/utils/db/mySqlDb.py @@ -18,7 +18,7 @@ def criar_conexao_mySql(): """ try: connection = mysql.connector.connect( - host='localhost', + host='mysqldb', port=3306, user=os.getenv('MYSQL_USER'), password=os.getenv('MYSQL_PASSWORD') From 9017ff46a495169d8b4db368367b5e2024243d0b Mon Sep 17 00:00:00 2001 From: Holdwich Date: Thu, 23 Jan 2025 18:28:40 -0300 Subject: [PATCH 13/15] =?UTF-8?q?[REFACTOR]=20Adicionando=20redirecionamen?= =?UTF-8?q?to=20para=20documenta=C3=A7=C3=A3o=20na=20rota=20index?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/main.py b/main.py index c75c3eb8..cdf9add0 100644 --- a/main.py +++ b/main.py @@ -10,3 +10,9 @@ app.include_router(item_controller.router) +@app.get("/") +def root(): + """ + Rota raiz que redireciona para a documentação da API. + """ + return {"message": "Acesse a documentação da API em /docs"} From b8c8638a30f084c6224a51b749f6ab83d12db072 Mon Sep 17 00:00:00 2001 From: Holdwich Date: Thu, 23 Jan 2025 18:29:03 -0300 Subject: [PATCH 14/15] [REFACTOR] implementando README.md do projeto --- README.md | 56 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 5c3393a9..fe4cc2a5 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,45 @@ -![WATTIO](http://wattio.com.br/web/image/1204-212f47c3/Logo%20Wattio.png) +# FastAPI com MySQL -#### Descrição +Este é um projeto de exemplo de uma API com FastAPI e persistência em um banco de dados MySQL. -O desafio consiste em implementar um CRUD de filmes, utilizando [python](https://www.python.org/ "python") integrando com uma API REST e uma possível persistência de dados. +## Inicialização com Docker -Rotas da API: +Para inicializar o projeto com docker, execute os comandos abaixo na raiz do projeto: +```bash +docker compose build +docker compose up +``` +Após 15 segundos, a aplicação deverá estar rodando. - - `/filmes` - [GET] deve retornar todos os filmes cadastrados. - - `/filmes` - [POST] deve cadastrar um novo filme. - - `/filmes/{id}` - [GET] deve retornar o filme com ID especificado. +## Estrutura do Projeto -O Objetivo é te desafiar e reconhecer seu esforço para aprender e se adaptar. Qualquer código enviado, ficaremos muito felizes e avaliaremos com toda atenção! +- `main.py`: Ponto de entrada da aplicação FastAPI. +- `controllers/`: Contém os controladores da API. +- `models/`: Define os modelos de dados e interfaces de repositório. +- `services/`: Contém serviços auxiliares, como a conexão com o banco de dados. +- `utils/`: Inclui utilitários, como a configuração do banco de dados. +- `docker-compose.yml`: Arquivo de configuração para o Docker Compose. +- `Dockerfile`: Define como a imagem Docker é construída. -#### Sugestão de Ferramentas -Não é obrigatório utilizar todas as as tecnologias sugeridas, mas será um diferencial =] +## Variáveis de Ambiente -- Orientação a objetos (utilizar objetos, classes para manipular os filmes) -- [FastAPI](https://fastapi.tiangolo.com/) (API com documentação auto gerada) -- [Docker](https://www.docker.com/) / [Docker-compose](https://docs.docker.com/compose/install/) (Aplicação deverá ficar em um container docker, e o start deverá seer com o comando ``` docker-compose up ``` -- Integração com banco de dados (persistir as informações em json (iniciante) /[SqLite](https://www.sqlite.org/index.html) / [SQLAlchemy](https://fastapi.tiangolo.com/tutorial/sql-databases/#sql-relational-databases) / outros DB) +Certifique-se de definir as variáveis de ambiente necessárias no arquivo `.env` antes de executar o build do projeto: +- `MYSQL_USER`: Usuário do banco de dados MySQL. (padrão: `root` (não recomendado em produção, ajustar docker-compose)) +- `MYSQL_PASSWORD`: Senha do banco de dados MySQL. (padrão: `root` (não recomendado em produção, ajustar docker-compose)) +- `MYSQL_DATABASE`: Nome do banco de dados a ser utilizado. (padrão: `filmesDB`) +- `DB_TYPE`: Tipo de banco de dados (`mysql` é a única implementação atualmente). -#### Como começar? +## Testando a API -- Fork do repositório -- Criar branch com seu nome ``` git checkout -b feature/ana ``` -- Faça os commits de suas alterações ``` git commit -m "[ADD] Funcionalidade" ``` -- Envie a branch para seu repositório ``` git push origin feature/ana ``` -- Navegue até o [Github](https://github.com/), crie seu Pull Request apontando para a branch **```main```** -- Atualize o README.md descrevendo como subir sua aplicação +Após iniciar o projeto, você pode acessar a documentação interativa da API em `http://localhost:8000/docs`. -#### Dúvidas? +## Finalizando o Projeto -Qualquer dúvida / sugestão / melhoria / orientação adicional só enviar email para hendrix@wattio.com.br +Para parar e remover os contêineres do Docker, utilize o comando: + +```bash +docker compose down +``` +``` -Salve! From a1971b3dc5b4ebc9d42f84ecc1c548a1c9e244fb Mon Sep 17 00:00:00 2001 From: Holdwich Date: Thu, 23 Jan 2025 18:30:14 -0300 Subject: [PATCH 15/15] =?UTF-8?q?[DOCS]=20Removendo=20formata=C3=A7=C3=A3o?= =?UTF-8?q?=20inserida=20por=20erro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index fe4cc2a5..545208b8 100644 --- a/README.md +++ b/README.md @@ -41,5 +41,4 @@ Para parar e remover os contêineres do Docker, utilize o comando: ```bash docker compose down ``` -```