diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..6891451 --- /dev/null +++ b/__init__.py @@ -0,0 +1 @@ +__init__.py diff --git a/app.py b/app.py new file mode 100644 index 0000000..fa8e98a --- /dev/null +++ b/app.py @@ -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) diff --git a/app/__init__.py b/app/__init__.py deleted file mode 100644 index 224b491..0000000 --- a/app/__init__.py +++ /dev/null @@ -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 diff --git a/app/__pycache__/__init__.cpython-311.pyc b/app/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index caa0f70..0000000 Binary files a/app/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/app/__pycache__/database.cpython-311.pyc b/app/__pycache__/database.cpython-311.pyc deleted file mode 100644 index 968d7af..0000000 Binary files a/app/__pycache__/database.cpython-311.pyc and /dev/null differ diff --git a/app/database.py b/app/database.py index f0b13d6..2fc4acd 100644 --- a/app/database.py +++ b/app/database.py @@ -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() diff --git a/app/models/__pycache__/__init__.cpython-311.pyc b/app/models/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 49245a3..0000000 Binary files a/app/models/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/app/models/__pycache__/invoice.cpython-311.pyc b/app/models/__pycache__/invoice.cpython-311.pyc deleted file mode 100644 index 5d41531..0000000 Binary files a/app/models/__pycache__/invoice.cpython-311.pyc and /dev/null differ diff --git a/app/models/__pycache__/user.cpython-311.pyc b/app/models/__pycache__/user.cpython-311.pyc deleted file mode 100644 index 7bb0fb0..0000000 Binary files a/app/models/__pycache__/user.cpython-311.pyc and /dev/null differ diff --git a/app/models/documentos.py b/app/models/documentos.py new file mode 100644 index 0000000..cc40d90 --- /dev/null +++ b/app/models/documentos.py @@ -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') diff --git a/app/models/invoice.py b/app/models/invoice.py deleted file mode 100644 index 8353f80..0000000 --- a/app/models/invoice.py +++ /dev/null @@ -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) diff --git a/app/models/organizacao.py b/app/models/organizacao.py new file mode 100644 index 0000000..4cd21f1 --- /dev/null +++ b/app/models/organizacao.py @@ -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') \ No newline at end of file diff --git a/app/models/user.py b/app/models/user.py index e147797..30d3c4b 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -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') diff --git a/app/routes/__pycache__/__init__.cpython-311.pyc b/app/routes/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5b588a2..0000000 Binary files a/app/routes/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/app/routes/__pycache__/invoice_routes.cpython-311.pyc b/app/routes/__pycache__/invoice_routes.cpython-311.pyc deleted file mode 100644 index e89114a..0000000 Binary files a/app/routes/__pycache__/invoice_routes.cpython-311.pyc and /dev/null differ diff --git a/app/routes/__pycache__/user_routes.cpython-311.pyc b/app/routes/__pycache__/user_routes.cpython-311.pyc deleted file mode 100644 index 2256179..0000000 Binary files a/app/routes/__pycache__/user_routes.cpython-311.pyc and /dev/null differ diff --git a/app/routes/documentos_routes.py b/app/routes/documentos_routes.py new file mode 100644 index 0000000..eead349 --- /dev/null +++ b/app/routes/documentos_routes.py @@ -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 diff --git a/app/routes/invoice_routes.py b/app/routes/invoice_routes.py deleted file mode 100644 index 20c8c69..0000000 --- a/app/routes/invoice_routes.py +++ /dev/null @@ -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]) diff --git a/app/routes/organizacao_routes.py b/app/routes/organizacao_routes.py new file mode 100644 index 0000000..dbb2723 --- /dev/null +++ b/app/routes/organizacao_routes.py @@ -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 diff --git a/app/routes/user_routes.py b/app/routes/user_routes.py index 08c18d6..cdc9285 100644 --- a/app/routes/user_routes.py +++ b/app/routes/user_routes.py @@ -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 \ No newline at end of file +@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 diff --git a/instance/database.db b/instance/database.db index 4105ad8..af95f31 100644 Binary files a/instance/database.db and b/instance/database.db differ diff --git a/run.py b/run.py deleted file mode 100644 index 2d75e1e..0000000 --- a/run.py +++ /dev/null @@ -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) \ No newline at end of file