Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions FILMES/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "servidor:app", "--host", "0.0.0.0", "--port", "8000"]
Binary file added FILMES/__pycache__/servidor.cpython-311.pyc
Binary file not shown.
Empty file added FILMES/app/__init__.py
Empty file.
Binary file added FILMES/app/__pycache__/__init__.cpython-311.pyc
Binary file not shown.
Binary file added FILMES/app/__pycache__/dados.cpython-311.pyc
Binary file not shown.
Binary file added FILMES/app/__pycache__/infra.cpython-311.pyc
Binary file not shown.
Binary file not shown.
Binary file added FILMES/app/__pycache__/tabelas.cpython-311.pyc
Binary file not shown.
16 changes: 16 additions & 0 deletions FILMES/app/dados.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

from pydantic import BaseModel

class FilmeBase(BaseModel):
titulo: str
diretor: str
ano: int

class FilmeCreate(FilmeBase):
pass

class FilmeOut(FilmeBase):
id: int

class Config:
orm_mode = True
9 changes: 9 additions & 0 deletions FILMES/app/infra.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base

SQLALCHEMY_DATABASE_URL = "sqlite:///./filmes.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
34 changes: 34 additions & 0 deletions FILMES/app/repositorio.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@

from sqlalchemy.orm import Session
from app import tabelas, dados

def buscar_todos(db: Session):
return db.query(tabelas.Filme).all()

def buscar_por_id(db: Session, filme_id: int):
return db.query(tabelas.Filme).filter(tabelas.Filme.id == filme_id).first()

def criar(db: Session, filme: dados.FilmeCreate):
novo_filme = tabelas.Filme(**filme.dict())
db.add(novo_filme)
db.commit()
db.refresh(novo_filme)
return novo_filme

def remover(db: Session, filme_id: int):
filme = buscar_por_id(db, filme_id)
if filme:
db.delete(filme)
db.commit()
return True
return False

def atualizar(db: Session, filme_id: int, dados_filme: dados.FilmeCreate):
filme = buscar_por_id(db, filme_id)
if filme:
for campo, valor in dados_filme.dict().items():
setattr(filme, campo, valor)
db.commit()
db.refresh(filme)
return filme
return None
10 changes: 10 additions & 0 deletions FILMES/app/tabelas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

from sqlalchemy import Column, Integer, String
from app.infra import Base

class Filme(Base):
__tablename__ = "filmes"
id = Column(Integer, primary_key=True, index=True)
titulo = Column(String, index=True)
diretor = Column(String, index=True)
ano = Column(Integer)
9 changes: 9 additions & 0 deletions FILMES/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@

services:
app:
build: .
ports:
- "8000:8000"
volumes:
- .:/app
command: uvicorn servidor:app --host 0.0.0.0 --port 8000
Binary file added FILMES/filmes.db
Binary file not shown.
4 changes: 4 additions & 0 deletions FILMES/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
fastapi
uvicorn
sqlalchemy
pydantic
44 changes: 44 additions & 0 deletions FILMES/servidor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from app import tabelas, dados, repositorio
from app.infra import engine, SessionLocal

tabelas.Base.metadata.create_all(bind=engine)
app = FastAPI(title="CRUD de Filmes")

def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()

@app.get("/filmes", response_model=list[dados.FilmeOut])
def listar(db: Session = Depends(get_db)):
return repositorio.buscar_todos(db)

@app.get("/filmes/{filme_id}", response_model=dados.FilmeOut)
def obter(filme_id: int, db: Session = Depends(get_db)):
filme = repositorio.buscar_por_id(db, filme_id)
if not filme:
raise HTTPException(status_code=404, detail="Filme não encontrado")
return filme

@app.post("/filmes", response_model=dados.FilmeOut)
def criar(filme: dados.FilmeCreate, db: Session = Depends(get_db)):
return repositorio.criar(db, filme)

@app.put("/filmes/{filme_id}", response_model=dados.FilmeOut)
def atualizar(filme_id: int, filme: dados.FilmeCreate, db: Session = Depends(get_db)):
filme_atualizado = repositorio.atualizar(db, filme_id, filme)
if not filme_atualizado:
raise HTTPException(status_code=404, detail="Filme não encontrado")
return filme_atualizado

@app.delete("/filmes/{filme_id}")
def deletar(filme_id: int, db: Session = Depends(get_db)):
sucesso = repositorio.remover(db, filme_id)
if not sucesso:
raise HTTPException(status_code=404, detail="Filme não encontrado")
return {"mensagem": "Filme removido com sucesso"}
40 changes: 3 additions & 37 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,37 +1,3 @@
![WATTIO](http://wattio.com.br/web/image/1204-212f47c3/Logo%20Wattio.png)

#### Descrição

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.

Rotas da API:

- `/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.

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!

#### Sugestão de Ferramentas
Não é obrigatório utilizar todas as as tecnologias sugeridas, mas será um diferencial =]

- 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)


#### Como começar?

- 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

#### Dúvidas?

Qualquer dúvida / sugestão / melhoria / orientação adicional só enviar email para [email protected]

Salve!
Olá, espero que gostem do CRUD!
Para acessar a interface, colocar "http://localhost:8000/docs" no navegador após ligar dar start no docker.
Muito obrigado!