diff --git a/app.py b/app.py index a773c47..da2e0da 100644 --- a/app.py +++ b/app.py @@ -20,6 +20,7 @@ from routes.service import service_bp from routes.service_roles import service_role_bp from routes.cameras import camera_bp from routes.ambiente import ambiente_bp +from routes.service_instance import service_instance_bp from routes.reports import employee_bp import logging from dotenv import load_dotenv @@ -119,6 +120,7 @@ def create_app(): app.register_blueprint(user_service_role_bp) app.register_blueprint(camera_bp) app.register_blueprint(ambiente_bp) + app.register_blueprint(service_instance_bp) # Testa a conexão com o banco de dados with app.app_context(): diff --git a/docs/camera/create.yml b/docs/camera/create.yml index 41b5d3d..78eaabd 100644 --- a/docs/camera/create.yml +++ b/docs/camera/create.yml @@ -31,6 +31,10 @@ parameters: type: integer description: ID do serviço associado example: 1 + service_instance_id: + type: integer + description: ID da empresa associada + example: 1 ambiente_id: type: integer description: ID do serviço associado @@ -65,6 +69,9 @@ responses: service_id: type: integer description: ID do serviço associado + service_instance_id: + type: integer + description: ID da empresa associada ambiente_id: type: integer description: ID do ambiente_id @@ -81,6 +88,7 @@ responses: service_id: 3 ambiente_id: 1 service_role_id: 5 + service_instance_id: 1 400: description: Requisição inválida (dados incorretos ou ausentes) content: diff --git a/docs/camera/get.yml b/docs/camera/get.yml index 8d2fc16..d6339d5 100644 --- a/docs/camera/get.yml +++ b/docs/camera/get.yml @@ -34,6 +34,9 @@ responses: service_role_id: type: "integer" example: 1 + service_instance_id: + type: "integer" + example: 1 404: description: "Função de serviço não encontrada" schema: diff --git a/docs/camera/list.yml b/docs/camera/list.yml index d1629f8..c336f74 100644 --- a/docs/camera/list.yml +++ b/docs/camera/list.yml @@ -83,6 +83,7 @@ responses: service_id: 1 ambiente_id: 1 service_role_id: 1 + service_instance_id: 1 - id: 2 name: "camera 1" @@ -92,6 +93,7 @@ responses: service_id: 1 ambiente_id: 1 service_role_id: 1 + service_instance_id: 1 401: description: Token inválido ou ausente content: diff --git a/docs/camera/update.yml b/docs/camera/update.yml index d8755bc..e7c3781 100644 --- a/docs/camera/update.yml +++ b/docs/camera/update.yml @@ -32,6 +32,12 @@ parameters: schema: type: "string" description: "url da camera." + - name: "service_instance_id" + in: "body" + required: false + schema: + type: "integer" + description: "empresa associada a camera." responses: 200: description: "Camera atualizada com sucesso" diff --git a/docs/service_instance/get.yml b/docs/service_instance/get.yml new file mode 100644 index 0000000..51352c8 --- /dev/null +++ b/docs/service_instance/get.yml @@ -0,0 +1,99 @@ +tags: + - Service Instance +summary: Lista todas as Empresas. +security: + - bearerAuth: [] +parameters: + - in: query + name: page + required: false + schema: + type: integer + default: 1 + description: Número da página a ser retornada + status: Status da empresa + - in: query + name: per_page + required: false + schema: + type: integer + default: 10 + description: Número de funções de serviço por página +responses: + 200: + description: Lista de cameras com informações de paginação + content: + application/json: + schema: + type: object + properties: + total: + type: integer + description: Número total de funções de serviço + pages: + type: integer + description: Número total de páginas + current_page: + type: integer + description: Página atual + per_page: + type: integer + description: Número de itens por página + roles: + type: array + items: + type: object + properties: + id: + type: integer + description: ID da empresa + name: + type: string + description: Nome da empresa + description: + type: string + description: Descrição da empresa + service_id: + type: integer + description: ID do serviço associado + + examples: + application/json: + total: 2 + pages: 1 + current_page: 1 + per_page: 10 + roles: + - id: 1 + name: "Farmacia" + description: "farmacia 1" + service_id: 1 + + - id: 2 + name: "Farmacia 2" + description: "Farmacia 2" + service_id: 1 + 401: + description: Token inválido ou ausente + content: + application/json: + schema: + type: object + properties: + error: + type: string + examples: + application/json: + error: "Token inválido ou ausente" + 404: + description: Nenhuma camera encontrada + content: + application/json: + schema: + type: object + properties: + error: + type: string + examples: + application/json: + error: "Nenhuma camera encontrada" diff --git a/models/cameras.py b/models/cameras.py index 3139a89..8760152 100644 --- a/models/cameras.py +++ b/models/cameras.py @@ -6,6 +6,7 @@ class Cameras(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) service_id = db.Column(db.Integer, db.ForeignKey('service.id'), nullable=False) ambiente_id = db.Column(db.Integer, db.ForeignKey('ambiente.id'), nullable=False) + service_instance_id = db.Column(db.Integer, db.ForeignKey('service_instance.id'), nullable=False) service_role_id = db.Column(db.Integer, db.ForeignKey('service_roles.id'), nullable=False) name = db.Column(db.String(255), nullable=False) description = db.Column(db.Text, nullable=True) diff --git a/routes/cameras.py b/routes/cameras.py index db27f52..6946f89 100644 --- a/routes/cameras.py +++ b/routes/cameras.py @@ -20,6 +20,7 @@ def create_camera(): status = data.get('status') description = data.get('description') url = data.get('url') + service_instance_id = data.get('service_instance_id') # Verifica se o serviço existe service = Service.query.get(service_id) @@ -40,6 +41,7 @@ def create_camera(): description=description, status=status, url=url, + service_instance_id = service_instance_id, ) @@ -70,6 +72,7 @@ def list_service_roles(): 'service_role_id': camera.service_role_id, 'status': camera.status, 'url':camera.url, + 'service_instance_id':camera.service_instance_id } for camera in cameras ], 'total': pagination.total, @@ -94,6 +97,7 @@ def get_service_role(camera_id): 'service_role_id': camera.service_role_id, 'status': camera.status, 'url':camera.url, + 'service_instance_id' : camera.service_instance_id }), 200 @camera_bp.route('/', methods=['PUT']) @@ -106,6 +110,7 @@ def update_camera(camera_id): status=data.get('status') url = data.get('url') ambiente_id = data.get('ambiente_id') + service_instance_id = data.get('service_instance_id') camera = Cameras.query.get(camera_id) if not camera: @@ -122,6 +127,8 @@ def update_camera(camera_id): camera.url = url if ambiente_id : camera.ambiente_id = ambiente_id + if service_instance_id: + camera.service_instance_id = service_instance_id db.session.commit() diff --git a/routes/service_instance.py b/routes/service_instance.py new file mode 100644 index 0000000..d61e96e --- /dev/null +++ b/routes/service_instance.py @@ -0,0 +1,31 @@ +from flask import Blueprint, request, jsonify +from flask_jwt_extended import jwt_required +from flasgger.utils import swag_from +from models.service_instance import ServiceInstance +from models.service import Service + +service_instance_bp = Blueprint('service_instance', __name__, url_prefix='/service_instance') + +@service_instance_bp.route('/', methods=['GET']) +@jwt_required() +@swag_from('../docs/service_instance/list.yml') +def list_ambiente(): + page = request.args.get('page', 1, type=int) + per_page = request.args.get('per_page', 10, type=int) + + pagination = ServiceInstance.query.paginate(page=page, per_page=per_page, error_out=False) + service_instances = pagination.items + + return jsonify({ + 'service_instance': [ + { + 'id': service_instance.id, + 'name': service_instance.name, + 'description': service_instance.description, + 'service_id': service_instance.service_id + } for service_instance in service_instances + ], + 'total': pagination.total, + 'page': pagination.page, + 'per_page': pagination.per_page + }), 200 diff --git a/seeds/ambiente_seed.py b/seeds/ambiente_seed.py index e01c1d2..3106413 100644 --- a/seeds/ambiente_seed.py +++ b/seeds/ambiente_seed.py @@ -5,18 +5,20 @@ def seed_ambiente(): ambientes = [ # Ambiente 1 { - "service_id": 4, + "service_id": 1, "service_role_id":4, "name": "Entrada", - "description": " Hall de Entrada, apresenta 3 cameras." + "description": " Hall de Entrada, apresenta 3 cameras.", + "status":"Active" }, # Ambiente 2 { - "service_id": 4, + "service_id": 1, "service_role_id":4, "name": "Estoque", - "description": "Estoque, apresenta 3 cameras." + "description": "Estoque, apresenta 3 cameras.", + "status":"Active" }, ] for ambiente_data in ambientes: @@ -34,7 +36,9 @@ def seed_ambiente(): name=ambiente_data["name"], description=ambiente_data["description"] ) + print("antes do banco") db.session.add(ambiente) + print("adiconei no banco") # Commit a transação para salvar os dados no banco db.session.commit() diff --git a/seeds/camera_seed.py b/seeds/camera_seed.py index ce59af0..95f4da5 100644 --- a/seeds/camera_seed.py +++ b/seeds/camera_seed.py @@ -10,6 +10,7 @@ def seed_cameras(): "service_role_id":3, "name": "Camera Hall de Entrada", "description": "Camera 1 Hall de entrada, modelo XXX.", + "url":"http://testecameraentrada", "status":"Active" }, @@ -20,6 +21,7 @@ def seed_cameras(): "service_role_id":3, "name": "Camera Estoque", "description": "Camera 1 Estoque, modelo XXX.", + "url":"http://testecamerestoque", "status":"Active" }, ] diff --git a/seeds/delet.py b/seeds/delet.py new file mode 100644 index 0000000..d31aa76 --- /dev/null +++ b/seeds/delet.py @@ -0,0 +1,35 @@ +import sys +import os +from flask import Flask + +from dotenv import load_dotenv + +# Carrega variáveis do .env +load_dotenv() + +# Adiciona o diretório raiz do projeto ao sys.path +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from extensions import db +app = Flask(__name__) + +# Configuração do banco de dados usando o .env +app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL') +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + +# Inicializa o db +db.init_app(app) + +def clear_all_tables(): + try: + with app.app_context(): + meta = db.metadata + for table in reversed(meta.sorted_tables): + print(f"Apagando dados da tabela: {table.name}") + # Comando para excluir os dados + result = db.session.execute(table.delete()) + db.session.commit() + print(f"✅ Dados apagados da tabela {table.name}") + except Exception as e: + print(f"Erro ao apagar dados: {e}") + +clear_all_tables() diff --git a/seeds/run_seed.py b/seeds/run_seed.py index 9b8c6ae..129b8a3 100644 --- a/seeds/run_seed.py +++ b/seeds/run_seed.py @@ -30,9 +30,10 @@ def run_all_seeds(): seed_contacts() seed_user_service_roles() seed_licenses() - seed_cameras() seed_ambiente() reports_seed() + seed_cameras() + print("Seeds executados com sucesso!") except Exception as e: db.session.rollback() diff --git a/seeds/service_instances_seed.py b/seeds/service_instances_seed.py index 084dea1..f53960c 100644 --- a/seeds/service_instances_seed.py +++ b/seeds/service_instances_seed.py @@ -21,9 +21,9 @@ def seed_service_instances(): # Verifica se as instâncias de serviço já existem, caso contrário, cria instances_data = [ - {"service_id": service_1.id, "name": "Farmácia 1", "description": "Instância para Farmácia 1"}, - #{"service_id": service_1.id, "name": "Escola Beta", "description": "Instância para Escola Beta"}, - #{"service_id": service_2.id, "name": "Campus Principal", "description": "Controle de Acesso Campus"}, + {"service_id": service_1.id, "name": "Drograsil", "description": "Instância para Farmácia Drogasil"}, + {"service_id": service_1.id, "name": "Fogo de Chão", "description": "Instância para Escola Fogo de Chão"}, + {"service_id": service_1.id, "name": "Sabin", "description": "Instancia para Farmacia Sabin"}, ] for instance_data in instances_data: diff --git a/seeds/service_role_permissions.py b/seeds/service_role_permissions.py index 6bcbe0c..be2904c 100644 --- a/seeds/service_role_permissions.py +++ b/seeds/service_role_permissions.py @@ -6,11 +6,12 @@ from models.user import User from extensions import db def seed_service_role_permissions(): - user = User.query.first() # Obtém o primeiro usuário para fins de exemplo + users = User.query.filter(User.id.in_([1, 3, 5])).all() # Alterado para considerar usuarios admins + service_instance = ServiceInstance.query.first() # Obtém a primeira instância de serviço # Verifica se há um usuário e uma instância de serviço - if user and service_instance: + if users and service_instance: # Define as permissões que você deseja atribuir permissions = [ {'name': "Read Access", 'description': "Permission to read data", 'type': 'read'}, @@ -18,49 +19,49 @@ def seed_service_role_permissions(): {'name': "Edit Access", 'description': "Permission to edit data", 'type': 'edit'}, {'name': "Delete Access", 'description': "Permission to delete data", 'type': 'delete'}, ] + for user in users: + # Itera sobre todos os service roles (1 a 10) + for service_role_id in range(1, 11): # Para cada role de 1 até 10 + service_role = ServiceRole.query.get(service_role_id) + if not service_role: + print(f"ServiceRole com id {service_role_id} não encontrado.") + continue # Se o service_role não existir, pula - # Itera sobre todos os service roles (1 a 10) - for service_role_id in range(1, 11): # Para cada role de 1 até 10 - service_role = ServiceRole.query.get(service_role_id) - if not service_role: - print(f"ServiceRole com id {service_role_id} não encontrado.") - continue # Se o service_role não existir, pula + # Para cada permissão definida, associa ao service role + for perm in permissions: + # Verifica se a permissão já existe no banco de dados + existing_permission = Permission.query.filter_by(name=perm['name']).first() + if not existing_permission: + # Se a permissão não existir, cria e adiciona ao banco + permission = Permission(name=perm['name'], description=perm['description']) + db.session.add(permission) + db.session.commit() + print(f"Permissão '{perm['name']}' criada com sucesso.") + else: + permission = existing_permission - # Para cada permissão definida, associa ao service role - for perm in permissions: - # Verifica se a permissão já existe no banco de dados - existing_permission = Permission.query.filter_by(name=perm['name']).first() - if not existing_permission: - # Se a permissão não existir, cria e adiciona ao banco - permission = Permission(name=perm['name'], description=perm['description']) - db.session.add(permission) - db.session.commit() - print(f"Permissão '{perm['name']}' criada com sucesso.") - else: - permission = existing_permission - - # Verifica se a permissão de papel de serviço já existe - existing_permission_role = ServiceRolePermission.query.filter_by( - service_role_id=service_role.id, - service_instance_id=service_instance.id, - permission_id=permission.id, - user_id=user.id - ).first() - - if not existing_permission_role: - # Se a permissão de papel de serviço não existir, cria e adiciona ao banco - service_role_permission = ServiceRolePermission( + # Verifica se a permissão de papel de serviço já existe + existing_permission_role = ServiceRolePermission.query.filter_by( service_role_id=service_role.id, service_instance_id=service_instance.id, permission_id=permission.id, - permission_type=perm['type'], # Definindo o tipo de permissão (read, write, etc.) user_id=user.id - ) - db.session.add(service_role_permission) - db.session.commit() - print(f"Permissão de papel de serviço '{perm['name']}' atribuída com sucesso para o role '{service_role.name}'.") - else: - print(f"Permissão de papel de serviço '{perm['name']}' já atribuída para o role '{service_role.name}'.") + ).first() + + if not existing_permission_role: + # Se a permissão de papel de serviço não existir, cria e adiciona ao banco + service_role_permission = ServiceRolePermission( + service_role_id=service_role.id, + service_instance_id=service_instance.id, + permission_id=permission.id, + permission_type=perm['type'], # Definindo o tipo de permissão (read, write, etc.) + user_id=user.id + ) + db.session.add(service_role_permission) + db.session.commit() + print(f"Permissão de papel de serviço '{perm['name']}' atribuída com sucesso para o role '{service_role.name}'.") + else: + print(f"Permissão de papel de serviço '{perm['name']}' já atribuída para o role '{service_role.name}'.") else: print("Usuário ou instância de serviço não encontrados.") diff --git a/seeds/service_roles.py b/seeds/service_roles.py index d32a2a8..ff7fcf2 100644 --- a/seeds/service_roles.py +++ b/seeds/service_roles.py @@ -3,6 +3,7 @@ from models.service_roles import ServiceRole def seed_service_roles(): roles = [ + #-------------------- Farmacia 1 ---------------------------------------- # Colaboradores Internos Role: Gestão de câmeras { "service_id": 1, @@ -58,6 +59,7 @@ def seed_service_roles(): "name": "Admin", "description": "Coordenador de plataforma." }, + ] # Verificar se o role já existe antes de criar diff --git a/seeds/services_seed.py b/seeds/services_seed.py index e22fec6..248d4a6 100644 --- a/seeds/services_seed.py +++ b/seeds/services_seed.py @@ -5,6 +5,7 @@ def seed_services(): services = [ #{"name": "Chamada Escolar Pro", "description": "Sistema de gestão para escolas"}, {"name": "Controle de Acesso", "description": "Gestão de acessos virtuais"}, + {"name": "Controle de Camera", "description": "Gestão de Camera"} ] for service_data in services: diff --git a/seeds/user_service_roles.py b/seeds/user_service_roles.py index 9e19cf6..4601f6a 100644 --- a/seeds/user_service_roles.py +++ b/seeds/user_service_roles.py @@ -7,7 +7,7 @@ def seed_user_service_roles(): service_instance_id = 1 # Exemplo: instância de serviço para associar os papéis # Criar até 10 service_role_ids para o usuário 1 na instância 1 - for service_role_id in range(1, 11): # Gerando service_role_id de 1 até 10 + for service_role_id in range(1, 9): # Gerando service_role_id de 1 até 10 user_role = UserServiceRole( user_id=user_id, service_instance_id=service_instance_id, diff --git a/seeds/users_seed.py b/seeds/users_seed.py index 16169bc..ef31dc1 100644 --- a/seeds/users_seed.py +++ b/seeds/users_seed.py @@ -5,6 +5,7 @@ from sqlalchemy.exc import IntegrityError def seed_users(): # Lista de usuários para criar users_data = [ + #---login farmacia 1----- { "username": "admin", "email": "admin@exemplo.com", @@ -17,6 +18,33 @@ def seed_users(): "phone": "987654321", "password": "senha456" }, + #-----login farmacia 2-------- + { + "username": "fogo_admin", + "email": "fogodechaoadmin@exemplo.com", + "phone": "983749265", + "password": "senha123" + }, + { + "username": "fogo_user_2", + "email": "fogodechaouser2@exemplo.com", + "phone": "983084637", + "password": "senha456" + }, + #----------login farmacia 3---------- + { + "username": "sabin_admin", + "email": "sabinadmin@exemplo.com", + "phone": "983749265", + "password": "senha123" + }, + { + "username": "sabin_user_2", + "email": "sabinuser2@exemplo.com", + "phone": "983086725", + "password": "senha456" + }, + ] users_added = False # Flag para verificar se algum usuário foi adicionado