front_ponto_eletronico/routes/contact.py
2025-03-17 15:00:51 -03:00

150 lines
4.6 KiB
Python

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('/<int:contact_id>', 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('/<int:contact_id>', 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('/<int:contact_id>', 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/<int:user_id>', 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