primeiro commit

This commit is contained in:
Antero Asafe Matos de Oliveira 2025-04-29 20:53:18 -04:00
parent 26c617175a
commit 572a248721
22 changed files with 164 additions and 69 deletions

1
__init__.py Normal file
View File

@ -0,0 +1 @@
__init__.py

11
app.py Normal file
View 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)

View File

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

View File

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

19
app/models/documentos.py Normal file
View 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')

View File

@ -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
View 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')

View File

@ -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): Base = declarative_base()
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False) class User(Base):
email = db.Column(db.String(100), unique=True, nullable=False) __tablename__ = 'users'
invoices = db.relationship("Invoice", backref="user", lazy=True)
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')

View 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

View File

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

View 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

View File

@ -1,23 +1,22 @@
from flask import Blueprint, jsonify, request from fastapi import APIRouter, HTTPException, Depends
from app.models.user import User from sqlalchemy.orm import Session
from app.database import db from models import User # seus models
from database import get_db
user_bp = Blueprint("users", __name__)
@user_bp.route("/", methods=["GET"]) router_user = APIRouter(prefix="/users", tags=["Users"])
def get_users():
users = User.query.all()
return jsonify([{"id": u.id, "name": u.name, "email": u.email} for u in users])
@user_bp.route("/", methods=["POST"]) @router_user.post("/")
def create_user(): def criar_user(nome: str, email: str, senha_hash: str, organizacao_id: int, db: Session = Depends(get_db)):
data = request.get_json() 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"): @router_user.get("/{user_id}")
return jsonify({"error": "Nome e email são obrigatórios"}), 400 def obter_user(user_id: int, db: Session = Depends(get_db)):
user = db.query(User).filter(User.id == user_id).first()
new_user = User(name=data["name"], email=data["email"]) if not user:
db.session.add(new_user) raise HTTPException(status_code=404, detail="Usuário não encontrado")
db.session.commit() return user
return jsonify({"message": "Usuário criado com sucesso!", "id": new_user.id}), 201

Binary file not shown.

10
run.py
View File

@ -1,10 +0,0 @@
from app import create_app
from app.database import db
app = create_app()
if __name__ == "__main__":
with app.app_context():
db.create_all()
print("Banco de dados criado com sucesso!")
app.run(debug=True)