primeiro commit
This commit is contained in:
parent
26c617175a
commit
572a248721
1
__init__.py
Normal file
1
__init__.py
Normal file
@ -0,0 +1 @@
|
||||
__init__.py
|
||||
11
app.py
Normal file
11
app.py
Normal file
@ -0,0 +1,11 @@
|
||||
from fastapi import FastAPI
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
@app.get("/")
|
||||
def read_root():
|
||||
return {"mensagem": "API está funcionando"}
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
uvicorn.run("app:app", host="127.0.0.1", port=5000, reload=True)
|
||||
@ -1,16 +0,0 @@
|
||||
from flask import Flask
|
||||
from app.database import db
|
||||
from app.routes.user_routes import user_bp
|
||||
from app.routes.invoice_routes import invoice_bp
|
||||
|
||||
def create_app():
|
||||
app = Flask(__name__)
|
||||
app.config.from_object("config")
|
||||
|
||||
db.init_app(app)
|
||||
|
||||
# Registrar blueprints
|
||||
app.register_blueprint(user_bp, url_prefix="/users")
|
||||
app.register_blueprint(invoice_bp, url_prefix="/invoices")
|
||||
|
||||
return app
|
||||
Binary file not shown.
Binary file not shown.
@ -1,3 +1,28 @@
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.orm import Session
|
||||
from .database import SessionLocal
|
||||
|
||||
db = SQLAlchemy()
|
||||
|
||||
# URL do banco - aqui usando SQLite local
|
||||
SQLALCHEMY_DATABASE_URL = "sqlite:///./meubanco.db"
|
||||
|
||||
# Para SQLite, o argumento check_same_thread é necessário
|
||||
engine = create_engine(
|
||||
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
|
||||
)
|
||||
|
||||
# Sessão de conexão com o banco
|
||||
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
||||
|
||||
# Base para os modelos
|
||||
Base = declarative_base()
|
||||
|
||||
# Dependência para obter uma sessão do banco de dados
|
||||
def get_db():
|
||||
db = SessionLocal()
|
||||
try:
|
||||
yield db
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
19
app/models/documentos.py
Normal file
19
app/models/documentos.py
Normal file
@ -0,0 +1,19 @@
|
||||
import uuid
|
||||
from sqlalchemy import Column, String, DateTime, ForeignKey, Integer
|
||||
from sqlalchemy.dialects.postgresql import UUID
|
||||
from sqlalchemy.orm import relationship
|
||||
from sqlalchemy.sql import func
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
class Documento(Base):
|
||||
__tablename__ = 'documentos'
|
||||
|
||||
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False)
|
||||
nome_arquivo = Column(String, nullable=False)
|
||||
caminho_arquivo = Column(String, nullable=False) # armazena o caminho do arquivo original
|
||||
usuario_id = Column(Integer, ForeignKey('users.id'), nullable=False)
|
||||
criado_em = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
|
||||
|
||||
usuario = relationship('User', back_populates='documentos')
|
||||
@ -1,6 +0,0 @@
|
||||
from app.database import db
|
||||
|
||||
class Invoice(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
amount = db.Column(db.Float, nullable=False)
|
||||
user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
|
||||
14
app/models/organizacao.py
Normal file
14
app/models/organizacao.py
Normal file
@ -0,0 +1,14 @@
|
||||
from sqlalchemy import Column, Integer, String, DateTime, func
|
||||
from sqlalchemy.orm import relationship
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
class Organizacao(Base):
|
||||
__tablename__ = 'organizacoes'
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True, unique=True)
|
||||
nome = Column(String, nullable=False, unique=True)
|
||||
criado_em = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
|
||||
|
||||
usuarios = relationship('User', back_populates='organizacao')
|
||||
@ -1,7 +1,19 @@
|
||||
from app.database import db
|
||||
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, func
|
||||
from sqlalchemy.orm import relationship
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
|
||||
class User(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
name = db.Column(db.String(100), nullable=False)
|
||||
email = db.Column(db.String(100), unique=True, nullable=False)
|
||||
invoices = db.relationship("Invoice", backref="user", lazy=True)
|
||||
Base = declarative_base()
|
||||
|
||||
class User(Base):
|
||||
__tablename__ = 'users'
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True, unique=True)
|
||||
nome = Column(String, nullable=False)
|
||||
email = Column(String, nullable=False, unique=True)
|
||||
senha_hash = Column(String, nullable=False)
|
||||
organizacao_id = Column(Integer, ForeignKey('organizacoes.id'), nullable=False)
|
||||
criado_em = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
|
||||
atualizado_em = Column(DateTime(timezone=True), onupdate=func.now())
|
||||
|
||||
organizacao = relationship('Organizacao', back_populates='usuarios')
|
||||
documentos = relationship('Documento', back_populates='usuario')
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
31
app/routes/documentos_routes.py
Normal file
31
app/routes/documentos_routes.py
Normal file
@ -0,0 +1,31 @@
|
||||
from fastapi import APIRouter, HTTPException, Depends
|
||||
from sqlalchemy.orm import Session
|
||||
from database import get_db
|
||||
|
||||
router_documento = APIRouter(prefix="/documentos", tags=["Documentos"])
|
||||
|
||||
|
||||
@router_documento.post("/")
|
||||
def criar_documento(
|
||||
nome_arquivo: str,
|
||||
caminho_arquivo: str,
|
||||
usuario_id: int,
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
documento = documento(
|
||||
nome_arquivo=nome_arquivo,
|
||||
caminho_arquivo=caminho_arquivo,
|
||||
usuario_id=usuario_id,
|
||||
)
|
||||
db.add(documento)
|
||||
db.commit()
|
||||
db.refresh(documento)
|
||||
return documento
|
||||
|
||||
|
||||
@router_documento.get("/{documento_id}")
|
||||
def obter_documento(documento_id: str, db: Session = Depends(get_db)):
|
||||
documento = db.query(documento).filter(documento.id == documento_id).first()
|
||||
if not documento:
|
||||
raise HTTPException(status_code=404, detail="Documento não encontrado")
|
||||
return documento
|
||||
@ -1,10 +0,0 @@
|
||||
from flask import Blueprint, jsonify
|
||||
from app.models.invoice import Invoice
|
||||
from app.database import db
|
||||
|
||||
invoice_bp = Blueprint("invoices", __name__)
|
||||
|
||||
@invoice_bp.route("/", methods=["GET"])
|
||||
def get_invoices():
|
||||
invoices = Invoice.query.all()
|
||||
return jsonify([{"id": i.id, "amount": i.amount, "user_id": i.user_id} for i in invoices])
|
||||
25
app/routes/organizacao_routes.py
Normal file
25
app/routes/organizacao_routes.py
Normal file
@ -0,0 +1,25 @@
|
||||
from fastapi import APIRouter, HTTPException, Depends
|
||||
from sqlalchemy.orm import Session
|
||||
from database import get_db
|
||||
|
||||
|
||||
router_organizacao = APIRouter(prefix="/organizacoes", tags=["Organizacoes"])
|
||||
|
||||
@router_organizacao.post("/")
|
||||
def criar_organizacao(nome: str, db: Session = Depends(get_db)):
|
||||
organizacao = db.query(organizacao).filter(organizacao.nome == nome).first()
|
||||
if organizacao:
|
||||
raise HTTPException(status_code=400, detail="Organização já existe")
|
||||
|
||||
nova_organizacao = organizacao(nome=nome)
|
||||
db.add(nova_organizacao)
|
||||
db.commit()
|
||||
db.refresh(nova_organizacao)
|
||||
return nova_organizacao
|
||||
|
||||
@router_organizacao.get("/{organizacao_id}")
|
||||
def obter_organizacao(organizacao_id: int, db: Session = Depends(get_db)):
|
||||
organizacao = db.query(organizacao).filter(organizacao.id == organizacao_id).first()
|
||||
if not organizacao:
|
||||
raise HTTPException(status_code=404, detail="Organização não encontrada")
|
||||
return organizacao
|
||||
@ -1,23 +1,22 @@
|
||||
from flask import Blueprint, jsonify, request
|
||||
from app.models.user import User
|
||||
from app.database import db
|
||||
from fastapi import APIRouter, HTTPException, Depends
|
||||
from sqlalchemy.orm import Session
|
||||
from models import User # seus models
|
||||
from database import get_db
|
||||
|
||||
user_bp = Blueprint("users", __name__)
|
||||
|
||||
@user_bp.route("/", methods=["GET"])
|
||||
def get_users():
|
||||
users = User.query.all()
|
||||
return jsonify([{"id": u.id, "name": u.name, "email": u.email} for u in users])
|
||||
router_user = APIRouter(prefix="/users", tags=["Users"])
|
||||
|
||||
@user_bp.route("/", methods=["POST"])
|
||||
def create_user():
|
||||
data = request.get_json()
|
||||
@router_user.post("/")
|
||||
def criar_user(nome: str, email: str, senha_hash: str, organizacao_id: int, db: Session = Depends(get_db)):
|
||||
user = User(nome=nome, email=email, senha_hash=senha_hash, organizacao_id=organizacao_id)
|
||||
db.add(user)
|
||||
db.commit()
|
||||
db.refresh(user)
|
||||
return user
|
||||
|
||||
if not data or not data.get("name") or not data.get("email"):
|
||||
return jsonify({"error": "Nome e email são obrigatórios"}), 400
|
||||
|
||||
new_user = User(name=data["name"], email=data["email"])
|
||||
db.session.add(new_user)
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({"message": "Usuário criado com sucesso!", "id": new_user.id}), 201
|
||||
@router_user.get("/{user_id}")
|
||||
def obter_user(user_id: int, db: Session = Depends(get_db)):
|
||||
user = db.query(User).filter(User.id == user_id).first()
|
||||
if not user:
|
||||
raise HTTPException(status_code=404, detail="Usuário não encontrado")
|
||||
return user
|
||||
|
||||
Binary file not shown.
Loading…
Reference in New Issue
Block a user