diff --git a/app/__init__.py b/app/__init__.py index 90d7fb3..1a14208 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,4 +1,25 @@ from flask import Flask +from app.database import db +# Importação dos blueprints +from app.routes.usuario import usuarios_bp +from app.routes.organizacao import organizacoes_bp +from app.routes.documentos import documentos_bp + + +def create_app(): + app = Flask(__name__) + app.config.from_object("config") + + # Inicializa a extensão SQLAlchemy + db.init_app(app) + + # Registra os blueprints + app.register_blueprint(usuarios_bp) + app.register_blueprint(organizacoes_bp) + app.register_blueprint(documentos_bp) + + return app +from flask import Flask from flasgger import Swagger from app.database import db from app.models.user import User diff --git a/app/models/Documento.py b/app/models/Documento.py new file mode 100644 index 0000000..7745b1c --- /dev/null +++ b/app/models/Documento.py @@ -0,0 +1,15 @@ +# documento.py +from app.database import db +import uuid + + +class Documento(db.Model): # + __tablename__ = 'documentos' + + id = db.Column(db.UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False) + nome_arquivo = db.Column(db.String, nullable=False) + caminho_arquivo = db.Column(db.String, nullable=False) + usuario_id = db.Column(db.Integer, db.ForeignKey('usuario.id'), nullable=False) + criado_em = db.Column(db.DateTime(timezone=True), server_default=db.func.now(), nullable=False) + + usuario = db.relationship('Usuario', back_populates='documentos') diff --git a/app/models/Organizacao.py b/app/models/Organizacao.py new file mode 100644 index 0000000..381fa09 --- /dev/null +++ b/app/models/Organizacao.py @@ -0,0 +1,13 @@ +from app.database import db + + +class Organizacao(db.Model): + __tablename__ = 'organizacao' + + id = db.Column(db.Integer, primary_key=True, + autoincrement=True, unique=True) + nome = db.Column(db.String, nullable=False, unique=True) + criado_em = db.Column(db.DateTime(timezone=True), + server_default=db.func.now(), nullable=False) + + usuarios = db.relationship('Usuario', back_populates='organizacao') diff --git a/app/models/usuario.py b/app/models/usuario.py new file mode 100644 index 0000000..2cfeda4 --- /dev/null +++ b/app/models/usuario.py @@ -0,0 +1,24 @@ +# usuario.py +from app.database import db + + +class Usuario(db.Model): + __tablename__ = 'usuario' + + id = db.Column(db.Integer, primary_key=True, + autoincrement=True, unique=True) + nome = db.Column(db.String, nullable=False) + email = db.Column(db.String, nullable=False, unique=True) + senha_hash = db.Column(db.String, nullable=False) + organizacao_id = db.Column(db.Integer, db.ForeignKey( + 'organizacao.id'), nullable=False) + criado_em = db.Column(db.DateTime(timezone=True), + server_default=db.func.now(), nullable=False) + atualizado_em = db.Column(db.DateTime( + timezone=True), onupdate=db.func.now()) + + organizacao = db.relationship('Organizacao', back_populates='usuarios') + documentos = db.relationship('Documento', back_populates='usuario') + + def __repr__(self): + return f'' \ No newline at end of file diff --git a/app/routes/documentos.py b/app/routes/documentos.py new file mode 100644 index 0000000..cd9ca29 --- /dev/null +++ b/app/routes/documentos.py @@ -0,0 +1,44 @@ +from flask import Blueprint, request, jsonify +from app.database import db +from app.models import Documento + + +documentos_bp = Blueprint('documentos', __name__, url_prefix='/documentos') + +@documentos_bp.route('/', methods=['GET']) +def get_documentos(): + documentos = Documento.query.all() + documentos_data = [ + { + 'id': str(doc.id), + 'nome_arquivo': doc.nome_arquivo, + 'caminho_arquivo': doc.caminho_arquivo, + 'usuario_id': doc.usuario_id, + 'criado_em': doc.criado_em + } + for doc in documentos + ] + return jsonify(documentos_data), 200 + +@documentos_bp.route('/', methods=['POST']) +def create_documento(): + data = request.get_json() + if not all(k in data for k in ('nome_arquivo', 'caminho_arquivo', 'usuario_id')): + return jsonify({'error': 'Campos obrigatórios ausentes'}), 400 + + try: + novo_documento = Documento( + nome_arquivo=data['nome_arquivo'], + caminho_arquivo=data['caminho_arquivo'], + usuario_id=data['usuario_id'] + ) + db.session.add(novo_documento) + db.session.commit() + + return jsonify({ + 'message': 'documento criado com sucesso', + 'id': str(novo_documento.id) + }), 201 + except Exception as e: + db.session.rollback() + return jsonify({'error': str(e)}), 500 diff --git a/app/routes/organizacao.py b/app/routes/organizacao.py new file mode 100644 index 0000000..e3307f3 --- /dev/null +++ b/app/routes/organizacao.py @@ -0,0 +1,43 @@ +from flask import Blueprint, request, jsonify +from app.database import db +from app.models import Organizacao # ajuste conforme sua estrutura + +organizacoes_bp = Blueprint( + 'organizacoes', __name__, url_prefix='/organizacoes') + + +@organizacoes_bp.route('/', methods=['GET']) +def get_organizacoes(): + organizacoes = Organizacao.query.all() + data = [ + { + 'id': org.id, + 'nome': org.nome, + 'criado_em': org.criado_em + } + for org in organizacoes + ] + return jsonify(data), 200 + + +@organizacoes_bp.route('/', methods=['POST']) +def create_organizacao(): + data = request.get_json() + if not data or 'nome' not in data: + return jsonify({'error': 'O campo "nome" é obrigatório'}), 400 + + if Organizacao.query.filter_by(nome=data['nome']).first(): + return jsonify({'error': 'Já existe uma organização com este nome'}), 409 + + try: + nova_org = Organizacao(nome=data['nome']) + db.session.add(nova_org) + db.session.commit() + + return jsonify({ + 'message': 'Organização criada com sucesso', + 'id': nova_org.id + }), 201 + except Exception as e: + db.session.rollback() + return jsonify({'error': str(e)}), 500 diff --git a/app/routes/usuario.py b/app/routes/usuario.py new file mode 100644 index 0000000..9ae5818 --- /dev/null +++ b/app/routes/usuario.py @@ -0,0 +1,44 @@ +from flask import Blueprint, request, jsonify +from app.database import db +from app.models.usuario import Usuario # nome correto do modelo + +usuarios_bp = Blueprint('usuarios', __name__, url_prefix='/usuarios') + + +@usuarios_bp.route('/', methods=['GET']) +def get_usuarios(): + usuarios = Usuario.query.all() + usuarios_data = [ + { + 'id': usuario.id, + 'nome': usuario.nome, + 'email': usuario.email, + 'organizacao_id': usuario.organizacao_id, + 'criado_em': usuario.criado_em, + 'atualizado_em': usuario.atualizado_em + } + for usuario in usuarios + ] + return jsonify(usuarios_data), 200 + + +@usuarios_bp.route('/', methods=['POST']) +def create_usuario(): + data = request.get_json() + if not all(k in data for k in ('nome', 'email', 'senha_hash', 'organizacao_id')): + return jsonify({'error': 'Campos obrigatórios ausentes'}), 400 + + if Usuario.query.filter_by(email=data['email']).first(): + return jsonify({'error': 'E-mail já está em uso'}), 409 + + novo_usuario = Usuario( + nome=data['nome'], + email=data['email'], + senha_hash=data['senha_hash'], + organizacao_id=data['organizacao_id'] + ) + + db.session.add(novo_usuario) + db.session.commit() + + return jsonify({'message': 'Usuário criado com sucesso', 'id': novo_usuario.id}), 201