front_ponto_eletronico/routes/address.py
2025-04-28 19:33:52 -03:00

153 lines
5.1 KiB
Python

from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required
from flasgger.utils import swag_from
from models.address import Address, db
from models.address_type import AddressType
from models.user import User
address_bp = Blueprint('address', __name__, url_prefix='/address')
@address_bp.route('/<int:user_id>/addresses', methods=['POST'])
@jwt_required()
@swag_from('../docs/address/create.yml')
def create_address(user_id):
data = request.get_json()
# Validações para os campos obrigatórios
if not data.get('street') or not data.get('city') or not data.get('state') or not data.get('zip_code') or not data.get('country') or not data.get('address_type_id'):
return jsonify({'error': 'Todos os campos obrigatórios devem ser preenchidos'}), 400
# Verifica se o tipo de endereço existe
address_type = AddressType.query.get(data['address_type_id'])
if not address_type:
return jsonify({'error': 'Tipo de endereço inválido'}), 400
# Verifica se o usuário existe
user = User.query.get_or_404(user_id)
# Cria um novo endereço
new_address = Address(
street=data['street'],
city=data['city'],
state=data['state'],
zip_code=data['zip_code'],
country=data['country'],
user_id=user.id,
address_type_id=data['address_type_id'],
number=data.get('number'), # Número é opcional
complement=data.get('complement'), # Complemento é opcional
neighborhood=data.get('neighborhood') # Bairro é opcional
)
db.session.add(new_address)
db.session.commit()
return jsonify({
'message': 'Endereço criado com sucesso',
'address': {
'id': new_address.id,
'street': new_address.street,
'city': new_address.city,
'state': new_address.state,
'zip_code': new_address.zip_code,
'country': new_address.country,
'number': new_address.number,
'complement': new_address.complement,
'neighborhood': new_address.neighborhood,
'address_type': new_address.address_type.name
}
}), 201
@address_bp.route('/<int:user_id>/addresses', methods=['GET'])
@jwt_required()
@swag_from('../docs/address/get_by_user_id.yml')
def get_addresses_by_user_id(user_id):
user = User.query.get_or_404(user_id)
addresses = Address.query.filter_by(user_id=user.id).all()
if not addresses:
return jsonify({'msg': 'Usuário não possui endereços'}), 404
# Formata os endereços para a resposta
address_data = [
{
'id': address.id,
'street': address.street,
'city': address.city,
'state': address.state,
'zip_code': address.zip_code,
'country': address.country,
'number': address.number,
'complement': address.complement,
'neighborhood': address.neighborhood,
'address_type': address.address_type.name
} for address in addresses
]
return jsonify({'addresses': address_data}), 200
@address_bp.route('/<int:address_id>', methods=['PUT'])
@jwt_required()
@swag_from('../docs/address/update.yml')
def update_address(user_id, address_id):
data = request.get_json()
user = User.query.get_or_404(user_id)
address = Address.query.get_or_404(address_id)
# Validações
if 'street' in data:
address.street = data['street']
if 'city' in data:
address.city = data['city']
if 'state' in data:
address.state = data['state']
if 'zip_code' in data:
address.zip_code = data['zip_code']
if 'country' in data:
address.country = data['country']
if 'number' in data:
address.number = data['number']
if 'complement' in data:
address.complement = data['complement']
if 'neighborhood' in data:
address.neighborhood = data['neighborhood']
if 'address_type_id' in data:
address_type = AddressType.query.get(data['address_type_id'])
if not address_type:
return jsonify({'error': 'Tipo de endereço inválido'}), 400
address.address_type_id = data['address_type_id']
db.session.commit()
return jsonify({
'message': 'Endereço atualizado com sucesso',
'address': {
'id': address.id,
'street': address.street,
'city': address.city,
'state': address.state,
'zip_code': address.zip_code,
'country': address.country,
'number': address.number,
'complement': address.complement,
'neighborhood': address.neighborhood,
'address_type': address.address_type.name
}
}), 200
@address_bp.route('/<int:address_id>', methods=['DELETE'])
@jwt_required()
@swag_from('../docs/address/delete.yml')
def delete_address(user_id, address_id):
user = User.query.get_or_404(user_id)
address = Address.query.get_or_404(address_id)
db.session.delete(address)
db.session.commit()
return jsonify({'message': 'Endereço excluído com sucesso'}), 200