135 lines
4.3 KiB
Python
135 lines
4.3 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']
|
|
)
|
|
|
|
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,
|
|
'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,
|
|
'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 '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,
|
|
'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
|