150 lines
4.6 KiB
Python
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
|