123 lines
3.8 KiB
Python
123 lines
3.8 KiB
Python
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('/<int:service_id>', 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('/<int:service_id>', 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('/<int:service_id>', 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('/<int:service_id>/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
|