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):
|
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')
|
||||||
|
|||||||
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 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.
Loading…
Reference in New Issue
Block a user