from flask import Blueprint, request, jsonify from flask_jwt_extended import jwt_required from flasgger.utils import swag_from from models.service import Service, db from models.service_instance import ServiceInstance # Relacionado ao modelo Service service_bp = Blueprint('service', __name__, url_prefix='/services') @service_bp.route('/', methods=['POST']) @jwt_required() @swag_from('../docs/services/create.yml') def create_service(): data = request.get_json() # Cria um novo serviço service = Service( name=data['name'], description=data.get('description') ) db.session.add(service) db.session.commit() return jsonify({'message': 'Serviço criado com sucesso', 'id': service.id}), 201 @service_bp.route('/', methods=['GET']) @jwt_required() @swag_from('../docs/services/list.yml') def list_services(): page = request.args.get('page', 1, type=int) per_page = request.args.get('per_page', 10, type=int) pagination = Service.query.paginate(page=page, per_page=per_page, error_out=False) services = pagination.items return jsonify({ 'services': [ { 'id': service.id, 'name': service.name, 'description': service.description, 'created_at': service.created_at, 'updated_at': service.updated_at } for service in services ], 'total': pagination.total, 'page': pagination.page, 'per_page': pagination.per_page }), 200 @service_bp.route('/', methods=['GET']) @jwt_required() @swag_from('../docs/services/get_by_id.yml') def get_service(service_id): service = Service.query.get_or_404(service_id) return jsonify({ 'id': service.id, 'name': service.name, 'description': service.description, 'created_at': service.created_at, 'updated_at': service.updated_at }), 200 @service_bp.route('/', methods=['PUT']) @jwt_required() @swag_from('../docs/services/update.yml') def update_service(service_id): data = request.get_json() service = Service.query.get_or_404(service_id) # Atualiza os campos fornecidos if 'name' in data and data['name'] != service.name: service.name = data['name'] if 'description' in data: service.description = data['description'] db.session.commit() return jsonify({'message': 'Serviço atualizado com sucesso'}), 200 @service_bp.route('/', methods=['DELETE']) @jwt_required() @swag_from('../docs/services/delete.yml') def delete_service(service_id): service = Service.query.get_or_404(service_id) # Verifica se há instâncias relacionadas antes de excluir if service.instances: return jsonify({'message': 'Não é possível excluir o serviço. Existem instâncias associadas.'}), 400 db.session.delete(service) db.session.commit() return jsonify({'message': 'Serviço excluído com sucesso'}), 200 @service_bp.route('//instances', methods=['GET']) @jwt_required() @swag_from('../docs/services/get_instances.yml') def get_service_instances(service_id): service = Service.query.get_or_404(service_id) # Recupera as instâncias relacionadas ao serviço instances = ServiceInstance.query.filter_by(service_id=service.id).all() if not instances: return jsonify({'message': 'Nenhuma instância encontrada para este serviço'}), 404 instance_data = [ { 'id': instance.id, 'name': instance.name, # Exemplo de campo, ajuste de acordo com ServiceInstance # 'status': instance.status, # Exemplo de campo 'created_at': instance.created_at } for instance in instances ] return jsonify({'instances': instance_data}), 200