from flask import Blueprint, request, jsonify from flask_jwt_extended import jwt_required from flasgger.utils import swag_from from models.contact import Contact, db from models.user import User contact_bp = Blueprint('contact', __name__, url_prefix='/contacts') @contact_bp.route('/', methods=['POST']) @jwt_required() @swag_from('../docs/contacts/create.yml') def create_contact(): data = request.get_json() # Lista de campos obrigatórios required_fields = ['phone', 'contact_type', 'user_id', 'description'] # Verifica se todos os campos obrigatórios estão presentes no body for field in required_fields: if field not in data: return jsonify({'error': f'O dado "{field}" precisa ser informado.'}), 400 # Cria um novo contato contact = Contact( phone=data['phone'], contact_type=data['contact_type'], description=data.get('description'), user_id=data['user_id'] ) db.session.add(contact) db.session.commit() return jsonify({'message': 'Contato criado com sucesso'}), 201 @contact_bp.route('/', methods=['GET']) @jwt_required() @swag_from('../docs/contacts/list.yml') def list_contacts(): # Recupera parâmetros de paginação da URL page = request.args.get('page', default=1, type=int) per_page = request.args.get('per_page', default=10, type=int) # Consulta paginada paginated_contacts = Contact.query.paginate(page=page, per_page=per_page, error_out=False) # Formata a resposta response = { 'contacts': [ { 'id': c.id, 'phone': c.phone, 'contact_type': c.contact_type, 'description': c.description, 'user_id': c.user_id } for c in paginated_contacts.items ], 'page': paginated_contacts.page, 'per_page': paginated_contacts.per_page, 'total': paginated_contacts.total, 'pages': paginated_contacts.pages } return jsonify(response), 200 @contact_bp.route('/', methods=['GET']) @jwt_required() @swag_from('../docs/contacts/get_by_id.yml') def get_contact(contact_id): contact = Contact.query.get(contact_id) if not contact: return jsonify({'msg': f'Contato com ID {contact_id} não encontrado.'}), 404 return jsonify({ 'id': contact.id, 'phone': contact.phone, 'contact_type': contact.contact_type, 'description': contact.description, 'user_id': contact.user_id }), 200 @contact_bp.route('/', methods=['PUT']) @jwt_required() @swag_from('../docs/contacts/update.yml') def update_contact(contact_id): data = request.get_json() # Valida que todos os campos obrigatórios estão presentes required_fields = ['phone', 'contact_type', 'user_id', 'description'] for field in required_fields: if field not in data: return jsonify({'msg': f'O campo "{field}" precisa ser informado.'}), 400 # Verifica se o usuário associado existe no banco de dados user = User.query.get(data['user_id']) if not user: return jsonify({'msg': 'Usuário associado ou contato não encontrado.'}), 404 contact = Contact.query.get_or_404(contact_id) # Atualiza os campos fornecidos contact.phone = data['phone'] contact.contact_type = data['contact_type'] contact.description = data.get('description') contact.user_id = data['user_id'] db.session.commit() return jsonify({'message': 'Contato atualizado com sucesso'}), 200 @contact_bp.route('/', methods=['DELETE']) @jwt_required() @swag_from('../docs/contacts/delete.yml') def delete_contact(contact_id): contact = Contact.query.get_or_404(contact_id) db.session.delete(contact) db.session.commit() return jsonify({'message': 'Contato excluído com sucesso'}), 200 @contact_bp.route('/user/', methods=['GET']) @jwt_required() @swag_from('../docs/contacts/get_by_user_id.yml') def get_user_contacts(user_id): # Recupera o usuário pelo ID user = User.query.get_or_404(user_id) # Recupera os contatos associados ao usuário contacts = Contact.query.filter_by(user_id=user.id).all() if not contacts: return jsonify({'msg': 'Usuário não encontrado ou sem contatos'}), 404 # Formata a resposta com os contatos do usuário contact_data = [ { 'id': contact.id, 'phone': contact.phone, 'contact_type': contact.contact_type, 'description': contact.description } for contact in contacts ] return jsonify({'contacts': contact_data}), 200