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('//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('//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('/', 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('/', 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